• [云原生] [kubernetes] 有了K8S的新基建,云原生起航了 !


    简介

    Pivotal公司的Matt Stine于2013年首次提出云原生(CloudNative)的概念;而Pivotal最新官网对云原生概括为4个要点:DevOps + 持续交付 + 微服务 + 容器。

    CNCF(云原生计算基金会) 定义是 能够在现代动态环境(如公共、私有和混合云)中构建和运行可伸缩的应用程序。容器、服务网格、微服务、不可变的基础设施和声明性 API 就是这种方法的例证。
    在这里插入图片描述

    CNCF成立后备受推崇,越来越多的项目和成员加入进来。截至目前,CNCF聚集的会员超过15万,项目贡献者超过8.5万人。
    目前,已经有10个项目从孵化到成熟,最终进入到毕业阶段。这10个项目分别是Kubernetes、Prometheus、Envoy、CoreDNS、containerd、TUF、Jaeger、Fluentd、Vitess,还有刚刚毕业的项目Helm。

    🚀 Kubernetes,大家再熟悉不过了,它是CNCF的第一个项目,作为开源容器编排系统,主要应用与自动化容器化应用程序的部署、扩展和管理。它已经是事实上的容器编排标准。云原生就从Kubernetes开始启航。
    关于基础定义概念 网络较多 请自行搜索文档,文章不再赘述, 直接上干货

    方法 / 步骤

    部署环境 CentOS7.9 / kubernetes 1.25.0 / docker 20.10.17

    🏭一: 前置环境设置 / 安装

    1.1 : 系统前置配置

    # 关闭防火墙
    systemctl stop firewalld
    systemctl disable firewalld
    
    # 临时关闭并修改文件内容
    setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
    # 永久关闭SELINUX
    vi /etc/selinux/config
    SELINUX=disabled
    
    # 关闭交换内存
    swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
    
    # 修改内核参数
    
    cat <<EOF > /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    
    # 生效
    sysctl --system
    modprobe br_netfilter
    lsmod | grep br_netfilter
    
    # 时间同步:  启动服务 &&  设置服务开机自启 &&  使用date命令验证时间
    systemctl start chronyd && systemctl enable chronyd && date
    
    
    

    1.2 : 安装Docker

    yum install yum-utils
    # 查看docker 列表
    yum list docker-ce --showduplicates | sort -r
    # 安装yum 工具
    yum install -y yum-utils
    # 切换yum仓库
    sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    # 安装docker指定版本 (推荐) 笔者centOS 7.9 安装 docker-ce-17.12.1.ce
    # yum -y install docker-ce-17.12.1.ce
    
    # 安装docker指定版本 (推荐) 笔者centOS 7.9 安装 docker-ce-19.03.15
    yum -y install docker-ce-19.03.15 docker-ce-cli-19.03.15 containerd.io
    
    
    # 设置镜像加速
    sudo mkdir -p /etc/docker
    # docker的cgroup驱动程序默认设置为system。默认情况下Kubernetes cgroup为systemd
    
    # 镜像加速
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": [
        "https://u2v98cer.mirror.aliyuncs.com",
        "https://0b27f0a81a00f3560fbdc00ddd2f99e0.mirror.swr.myhuaweicloud.com",
        "https://registry.docker-cn.com",
        "http://hub-mirror.c.163.com",
        "https://docker.mirrors.ustc.edu.cn"
      ],
      "exec-opts": ["native.cgroupdriver=systemd"]
    }
    EOF
    
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
    # 设置开机启动并且启动docker
    systemctl enable docker && systemctl start docker
    
    

    🚄 二:安装kubernetes组件

    2.1 : 配置kubernetes镜像源

    # 由于kubernetes的镜像在国外,速度比较慢,这里切换成国内的镜像源
    # 编辑/etc/yum.repos.d/kubernetes.repo,直接写入下面的配置 
    
    cat <<EOF > /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
    enabled=1
    gpgcheck=0 
    repo_gpgcheck=0
    gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF
    

    2.2 安装K8S三剑客 kubelet kubeadm kubectl

    K8S官方仓库选择版本

    #首先查询组件是否安装过组件
    yum list installed | grep kube
    # 由于版本更新频繁,这里指定版本号部署安装
    yum install --setopt=obsoletes=0 kubelet-1.20.15 kubeadm-1.20.15 kubectl-1.20.15 -y
    
    
    
    
    # 配置kubelet的cgroup
    # 编辑/etc/sysconfig/kubelet, 添加下面的配置
    KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
    KUBE_PROXY_MODE="ipvs"
    
    # 设置开机自动启动
    systemctl enable kubelet
    # 启动K8S
    systemctl start kubelet
    # 重启K8S
    systemctl restart kubelet
    

    在这里插入图片描述

    三:集群配置

    3.1 准备集群镜像源

    # 查看所需镜像
    kubeadm config images list
    

    在这里插入图片描述

    # 下载镜像 
    # 此镜像kubernetes的仓库中,由于网络原因,无法连接,下面提供了一种替换方案(注意这里版本号换成自己版本适配的版本号)
    images=(
    	kube-apiserver:v1.20.15
    	kube-controller-manager:v1.20.15
    	kube-scheduler:v1.20.15
    	kube-proxy:v1.20.15
    	pause:3.2
    	etcd:3.4.13-0
    	coredns:1.7.0
    )
    
    for imageName in ${images[@]};do
    	docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
    	docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
    	docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName 
    done
    

    在这里插入图片描述

    3.2 查看docker镜像

    docker images
    

    在这里插入图片描述

    3.3 集群初始化

    3.3.1 master节点启动集群 (只需要在master节点执行)

    下面的操作只需要在master节点上执行即可

    # 创建集群
    # 下面是启动的一些配置,
    # 需要修改--apiserver-advertise-address 这个地址为你的master节点的ip地址
    # kubernetes-version 是你的k8s版本
    kubeadm init \
        --apiserver-advertise-address=192.168.11.235 \
        --kubernetes-version=v1.20.15 \
        --service-cidr=10.96.0.0/12 \
        --pod-network-cidr=10.244.0.0/16
        
    # 运行成功后 会在/etc/kubernetes/文件夹下面多 
    # scheduler.conf kubelet.conf controller-manager.conf admin.conf  这几个文件
    # 创建必要文件
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
    # K8S在kubeadm init以后查询kubeadm join
    kubeadm token create --print-join-command
    # 重新生成token 
    kubeadm token create
    

    在这里插入图片描述

    3.3.2 node节点加入集群 (只需要在node节点执行)

    下面的操作只需要在node节点上执行即可

    将集群启动时的命令复制过来到node节点中执行

    kubeadm join 192.168.11.235:6443 --token s5ltc4.h9qu8jpfoqw2cjpb \
         --discovery-token-ca-cert-hash sha256:697f8b35d6e00acd1048ef6ece637537055f4e82c707de57b3288248bf1b6453
    

    3.4 master查看节点信息

    kubectl get nodes
    

    在这里插入图片描述

    看到为NotReady状态,这是为什么呢?这是因为它的网络插件没有安装, node节点需要安装网络插件才能保证所有的pod在一个局域网内通信

    3.5 网络插件安装

    node节点需要安装flannel网络插件才能保证所有的pod在一个局域网内通信,直接使用yum安装即可,
    kubernetes支持多种网络插件,比如flannel、calico、canal等,任选一种即可,本次选择flannel
    注意是所有node节点都需要安装, 先在master节点操作,下载flannel配置文件

    # 在所有机器再次刷新下docker配置
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
    cd /usr/local/
    wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    # 使用配置文件启动fannel
    kubectl apply -f kube-flannel.yml
    
    # 查看K8S系统服务是否都启动成功(如果有报错可以查看文章末尾是否有解决方案)
    kubectl get pods -n kube-system
    

    在这里插入图片描述

    # 在子节点运行获取命名空间
    kubectl  get ns
    

    在这里插入图片描述
    原因:kubernetes master没有与本机绑定,集群初始化的时候没有绑定,此时设置在本机的环境变量即可解决问题。具体根据情况,此处记录linux设置该环境变量

    • 方式一:编辑文件设置 etc/profile
      在底部增加新的环境变量 export KUBECONFIG=/etc/kubernetes/admin.conf
    • 方式二:直接追加文件内容
      echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
    • 生效配置
      source /etc/profile

    3.6 集群测试

    已经将k8s集群安装配置完毕 下面在Kubernetes集群中部署一个Nginx程序,测试下集群是否正常工作。

    3.6.1 创建一个nginx服务
    kubectl create deployment nginx  --image=nginx:1.14-alpine
    # 暴露端口
    kubectl expose deploy nginx --port=80 --target-port=80 --type=NodePort
    # 查看服务
    kubectl get pod,svc
    
    

    在这里插入图片描述

    怎么访问呢?可以看到nginx暴露的端口有两个80 和 30692这两个那个是对外的呢?32351 是对外的

    访问格式:http://maser节点ip:暴露的端口

    http://192.168.11.235:30692
    或者在命令行输入:curl http://192.168.11.235:30692


    在这里插入图片描述

    其他遇到问题总结

    K8S常用命令

    参考资料 & 致谢

  • 相关阅读:
    docker-compose 搭建redis集群 docker.errors.InvalidArgument: “host” network_mode异常
    Ribbon负载均衡
    SD-WAN在汽车零部件供应商中的成功案例分享
    Python的基础语法(八)(持续更新)
    配音软件文字转语音有哪些?
    网络安全人才就业前景如何?
    C++ 内存分区模型
    GIT分布式版本控制系统 | 命令讲解入门
    第2关:BeautifulSoup解析网页
    《HelloGitHub》第 91 期
  • 原文地址:https://blog.csdn.net/YangCheney/article/details/127022702