• 整理的最新版的K8S安装教程,看完还不会,请你吃瓜


    最近在参加华为推出的华为云云原生入门级开发者认证人才计划活动 于是想自己动手部署K8S的环境来学习,去年自己也采用二进制的方式部署过,时隔一年K8S的版本已经更新到了v1.24.3啦。在v1.24版本之后,k8s都已经抛弃了docker。抱着学习的心态尝试了k8s的v1.24.3版本的安装,这次采用kubeadm的部署方式,过程非常坎坷,但是还是顺利的部署成功。

    环境准备

    三台机都是采用centos7的操作系统,内核版本号是3.10.0-693.el7.x86_64


    角色IPkubernetes版本
    master192.168.248.130v1.24.3
    node1192.168.248.131v1.24.3
    node2192.168.248.132v1.24.3

    由于K8S从1.24版本之后,开始弃用了docker。改用了containerd ,containerd是容器虚拟化技术,从docker中剥离出来,形成开放容器接口(OCI)标准的一部分。 containerd与docker相兼容,相比docker轻量很多,目前较为成熟。

    主机间做信任

    在master节点上生成秘钥文件,并把它上传到其他两台机上,做好免密登录,方便后续的操作。

    执行ssh-copy-id root@192.168.248.129命令实现免密登录,其他两台做同样的操作。

    安装ansible工具

    ansible工具主要为了后续多台机器执行同样的命令,从而提供效率用的。安装方式也很简单,通过yum源安装即可。执行如下两条命令:

    [root@master ~]# yum install epel-release -y
    [root@master ~]# yum -y install ansible
    
    • 1
    • 2

    配置/etc/ansible/hosts,该文件是存放要操作的主机,把上述三台机器加入一个组名字为k8s,如下:

    [k8s]
    192.168.248.128
    192.168.248.129
    192.168.248.130
    
    • 1
    • 2
    • 3
    • 4

    通过执行ansible命令测试连通性,如下图:

    -m:是指定ansible的模块,ping是ansible其中一个模块,该模块主要是测试主机的连通性。
    k8s:刚定义的组名

    升级内核版本

    检查当前 CentOS 系统内核版本 ,执行如下命令查看:

    [root@localhost ~]# uname -sr
    Linux 3.10.0-1160.el7.x86_64
    
    • 1
    • 2

    检查发现当前内核版本是3.10,

    使用elrepo源升级内核

    配置elrepo源,执行如下命令

    rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
    yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
    
    • 1
    • 2

    查看最新版内核

    执行如下命令查看最新的内核版本

    yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
    
    • 1

    内核版本说明:

    • kernel-ml #主线版本,比较新
    • kernel-lt #长期支持版本,比较旧

    安装最新的内核版本

    执行如下命令安装主线版本:

    yum --enablerepo=elrepo-kernel install kernel-ml -y
    
    • 1

    设置系统默认内核

    查看系统上的所有内核版本:

    [root@localhost ~]# awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
    0 : CentOS Linux (5.18.14-1.el7.elrepo.x86_64) 7 (Core)
    1 : CentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core)
    2 : CentOS Linux (0-rescue-9dad18ee9dde4729b1c6df225ce69c4a) 7 (Core)
    [root@localhost ~]#
    
    • 1
    • 2
    • 3
    • 4
    • 5

    设置默认内核为我们刚才升级的内核版本

    cp /etc/default/grub /etc/default/grub-bak #备份
    grub2-set-default 0 #设置默认内核版本
    vi /etc/default/grub
    GRUB_DEFAULT=saved修改为GRUB_DEFAULT=0
    
    • 1
    • 2
    • 3
    • 4

    重新创建内核配置

    grub2-mkconfig -o /boot/grub2/grub.cfg
    
    • 1

    查看默认内核

    grubby --default-kernel
    #/boot/vmlinuz-5.18.14-1.el7.elrepo.x86_64
    grub2-editenv  list
    #saved_entry=0
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    更新软件包并重启

    yum makecache
    reboot
    
    • 1
    • 2

    初始化

    安装K8S之前需要对系统进行一些设置,比如 关闭防火墙,selinux,swap,设置主机名,ip解析,时间同步 。

    关闭防火墙

    通过ansible把三台机器的防火墙关闭,并设置开机不启动。执行如命令:

    ansible k8s -m shell -a "systemctl stop  firewalld"
    ansible k8s -m shell -a "systemctl disable   firewalld "
    
    • 1
    • 2

    关闭selinux

    通过ansible把三台机器的selinux永久关闭,执行如命令:

    ansible k8s -m shell -a "sed -i 's/enforcing/disabled/' /etc/selinux/config"
    
    • 1

    关闭swap

    执行swapoff -a 临时关闭,通过修改/etc/fstab文件实现永久关闭。执行如下命令

    ansible k8s -m shell -a "sed -ri 's/.*swap.*/#&/' /etc/fstab"
    
    • 1

    修改主机名

    分别对三台主机进行主机名的修改,执行如下的命令

    # 根据规划设置主机名【master节点上操作】
    hostnamectl set-hostname master
    # 根据规划设置主机名【node1节点操作】
    hostnamectl set-hostname node1
    # 根据规划设置主机名【node2节点操作】
    hostnamectl set-hostname node2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    修改hosts文件

    在master节点上修改hosts文件,根据规划进行修改,如下:

    192.168.248.130 master1
    192.168.248.131 node2
    192.168.248.132 node1
    
    • 1
    • 2
    • 3

    将桥接的IPv4流量传递到iptables的链

    /etc/sysctl.d/目录上新增k8s.conf,内容如下,并把该文件拷贝到其他两台机器上

    net.bridge.bridge-nf-call-ip6tables = 11
    net.bridge.bridge-nf-call-iptables = 1
    net.ipv4.ip_forward = 1
    
    • 1
    • 2
    • 3
    ansible k8s -m copy -a "src=/etc/sysctl.d/k8s.conf dest=/etc/sysctl.d/k8s.conf"
    
    • 1

    执行 sysctl --system命令使配置生效:

    ansible k8s -m shell -a "sysctl --system"
    
    • 1

    配置时间同步

    使用yum命令安装ntpdate ,如下:

    ansible k8s -m shell -a "yum install ntpdate -y"
    
    • 1

    配置NTP网络时间同步服务器地址为 ntp.aliyun.com,执行如下命令:

     ansible k8s -m shell -a "ntpdate ntp.aliyun.com"
    
    • 1

    安装containerd

    执行如下命令下载最新containerd,如下:

    wget https://download.fastgit.org/containerd/containerd/releases/download/v1.6.6/cri-containerd-cni-1.6.6-linux-amd64.tar.gz
    
    • 1

    如果出现无法建立 SSL 连接 加上–no-check-certificate

    解压containerd安装包

    tar -C / -zxf cri-containerd-cni-1.6.6-linux-amd64.tar.gz
    
    • 1

    配置环境变量,编辑用户目录下的bashrc文件添加如下内容:

    export PATH=$PATH:/usr/local/bin:/usr/local/sbin
    
    • 1

    并执行如下命令使环境变量立即生效:

    source ~/.bashrc
    
    • 1

    执行如下命令启动containerd

    systemctl start  containerd
    
    • 1

    执行如下命令查看版本号,出现如下信息表明安装成功。

    [root@master1 ~]# ctr version
    Client:
      Version:  v1.6.6
      Revision: 10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
      Go version: go1.17.11
    
    Server:
      Version:  v1.6.6
      Revision: 10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
      UUID: c205638a-6c08-43a8-81a4-b15f97ef5cdc
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    创建默认配置文件

    mkdir /etc/containerd
    containerd config default > /etc/containerd/config.toml
    
    • 1
    • 2

    测试containerd是否能创建和启动成功

    执行如下命令拉取镜像并创建容器:

    ctr i pull docker.io/library/nginx:alpine #拉取容器
    ctr c create --net-host docker.io/library/nginx:alpine nginx #创建容器
    ctr task start -d nginx
    
    • 1
    • 2
    • 3

    如果启动容器出现如下报错,是由于 缺少 runc并升级libseccomplibseccomp需要高于2.4版本。

    containerdv1.6.4版本以后使用v1.1.2runcv1.1.1cni

    ctr: failed to create shim task: OCI runtime create failed: unable to retrieve OCI runtime error (open /run/containerd/io.containerd.runtime.v2.task/default/nginx/log.json: no such file or directory): fork/exec /
    
    • 1

    下载链接,下载之后,执行如下命令安装并查看版本号:

    install -m 755 runc.amd64 /usr/local/sbin/runc
    runc -v
    
    • 1
    • 2

    执行如下命令升级libseccomp

    rpm -qa | grep libseccomp #查询原来的版本
    rpm -e libseccomp-2.3.1-4.el7.x86_64 --nodeps #卸载原来的版本
    #下载高版本的
    wget http://rpmfind.net/linux/centos/8-stream/BaseOS/x86_64/os/Packages/libseccomp-2.5.1-1.el8.x86_64.rpm 
    rpm -ivh libseccomp-2.5.1-1.el8.x86_64.rpm #安装
    
    • 1
    • 2
    • 3
    • 4
    • 5

    安装kubernetes

    添加kubernetes源

    在master节点上添加k8s软件源,并分发到其他两台机器上。在/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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    把kubernetes.repo文件分发到其他两台机器上,执行如下命令:

    ansible k8s -m copy -a "src=/etc/yum.repos.d/kubernetes.repo dest=/etc/yum.repos.d/kubernetes.repo"
    
    • 1

    安装

    在master节点下执行如下命令安装相应的软件:

    yum install -y kubelet-1.24.3 kubeadm-1.24.3 kubectl-1.24.3
    
    • 1

    生成默认配置并修改相应的参数

    通过如下命名生成一个默认的配置文件:

    kubeadm config print init-defaults >; kubeadm-init.yaml
    
    • 1

    根据自己的环境修改对应的参数:

    apiVersion: kubeadm.k8s.io/v1beta3
    bootstrapTokens:
    - groups:
      - system:bootstrappers:kubeadm:default-node-token
      token: abcdef.0123456789abcdef
      ttl: 24h0m0s
      usages:
      - signing
      - authentication
    kind: InitConfiguration
    localAPIEndpoint:
      advertiseAddress: 192.168.248.130  #master节点IP
      bindPort: 6443
    nodeRegistration:
      criSocket: unix:///run/containerd/containerd.sock #containerd容器路径
      imagePullPolicy: IfNotPresent
      name: master1
      taints: null
    ---
    apiServer:
      timeoutForControlPlane: 4m0s
    apiVersion: kubeadm.k8s.io/v1beta3
    certificatesDir: /etc/kubernetes/pki
    clusterName: kubernetes
    controllerManager: {}
    dns: {}
    etcd:
      local:
        dataDir: /var/lib/etcd
    imageRepository: registry.aliyuncs.com/google_containers  #阿里云容器源地址
    kind: ClusterConfiguration
    kubernetesVersion: 1.24.3
    networking:
      dnsDomain: cluster.local
      podSubnet: 10.244.0.0/16  #pod的IP网段
      serviceSubnet: 10.96.0.0/12
    scheduler: {}
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    初始化

    执行如下命令进行初始化:

     kubeadm init --config=kubeadm-init.yaml   --v=6
    
    • 1

    –config:指定根据那个配置文件进行初始
    –v:指定日志级别,越高越详细

    初始化成功后,会出现以下信息

    ...省略...
    Your Kubernetes control-plane has initialized successfully!
    
    To start using your cluster, you need to run the following as a regular user:
    
      mkdir -p $HOME/.kube
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
    Alternatively, if you are the root user, you can run:
    
      export KUBECONFIG=/etc/kubernetes/admin.conf
    
    You should now deploy a pod network to the cluster.
    Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
      https://kubernetes.io/docs/concepts/cluster-administration/addons/
    
    Then you can join any number of worker nodes by running the following on each as root:
    
    kubeadm join 192.168.248.130:6443 --token abcdef.0123456789abcdef \
            --discovery-token-ca-cert-hash sha256:e9e29c804f92193928f37ca157b73a7ad77e7929314db98855b3ba6e2ce2273d
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    按照初始化成功提示信息,做如下操作:

    mkdir -p $HOME/.kube
    cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    chown $(id -u):$(id -g) $HOME/.kube/config
    
    • 1
    • 2
    • 3

    接下来执行kubectl就可以看到node

    [root@master1 .kube]# kubectl get node
    NAME      STATUS   ROLES           AGE   VERSION
    master1   Ready    control-plane   55m   v1.24.3
    
    • 1
    • 2
    • 3

    查看k8s各部件启动情况,执行如下命令:

    kubectl get pod --all-namespaces -o wide
    
    • 1

    通过观察发现coredns部件没有运行成功,通过如下命令查看原因:

    describe pod coredns-74586cf9b6-c2ddb --namespace=kube-system
    
    • 1

    根据官方的解析是没有部署CNI,coredns是不会启动的。

    node节点配置

    node节点安装kubeadm

    cat <<EOF > /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
    enabled=1
    gpgcheck=0
    repo_gpgcheck=0
    gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
            http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    安装相关组件

    yum install -y kubeadm-1.24.3 --disableexcludes=kubernetes
    
    • 1

    添加join命令

    kubeadm join 192.168.248.130:6443 --token abcdef.0123456789abcdef \
            --discovery-token-ca-cert-hash sha256:e9e29c804f92193928f37ca157b73a7ad77e7929314db98855b3ba6e2ce2273d
    
    • 1
    • 2

    如果我们后续需要添加node节点时,可以到master节点执行下面的命令获取token相关信息

    [root@master1 ~]# kubeadm token create --print-join-command
    kubeadm join 192.168.248.130:6443 --token ydqnz1.6b0q5ntkvos9z2ir --discovery-token-ca-cert-hash sha256:c0b6f7fb38c7c9764084beb7dd26c9acef027ae6b7d2673572b4c2e3a0dfd6cb
    
    • 1
    • 2

    如果添加某台节点异常了,修改后可以执行 kubeadm reset 的命令,然后在重新join加入

    网络配置

    coredns还没启动,因为还没有安装网络插件,接下来安装网络插件,可以在该文档中选择我们自己的网络插件,这里安装flannel

    wget http://down.i4t.com/k8s1.24/kube-flannel.yml
    
    • 1

    根据需求修改网卡配置,我这里ens33为主的:

          containers:
          - name: kube-flannel
            image: quay.io/coreos/flannel:v0.12.0-amd64
            command:
            - /opt/bin/flanneld
            args:
            - --ip-masq
            - --kube-subnet-mgr
            - --iface=ens33  # 如果是多网卡的话,指定内网网卡的名称
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在kubeadm.yaml文件中设置了podSubnet网段,同时在flannel中网段也要设置相同的。 (我这里默认就是相同的配置)

    执行部署

    kubectl apply -f kube-flannel.yml
    
    • 1

    CNI插件问题

    默认情况下containerd也会有一个cni插件,但是我们已经安装Flannel了,我们需要使用Flannel的cni插件,需要将containerd里面的cni配置文件进行注释,否则2个配置会产生冲突 。
    因为如果这个目录中有多个 cni 配置文件,kubelet 将会使用按文件名的字典顺序排列的第一个作为配置文件,所以前面默认选择使用的是 containerd-net 这个插件。  
    
    • 1
    • 2
    mv /etc/cni/net.d/10-containerd-net.conflist /etc/cni/net.d/10-containerd-net.conflist.bak
    systemctl restart containerd kubelet
    
    • 1
    • 2

    接下来我们所有的pod都可以正常运行了

    验证

    验证dns是否正常能解析和pod之间。这里新建一个测试的yaml文件,内容如下:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
    spec:
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - image: nginx:alpine
            name: nginx
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
    spec:
      selector:
        app: nginx
      type: NodePort
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
          nodePort: 30001
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: busybox
      namespace: default
    spec:
      containers:
      - name: busybox
        image: abcdocker9/centos:v1
        command:
          - sleep
          - "3600"
        imagePullPolicy: IfNotPresent
      restartPolicy: Always
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    执行下面命令,创建pod

    kubectl apply -f test.yaml
    
    • 1

    使用nslookup查看是否能返回地址

    [root@master1 ~]# kubectl exec -it busybox -- nslookup kubernetes
    Server:         10.96.0.10
    Address:        10.96.0.10#53
    
    Name:   kubernetes.default.svc.cluster.local
    Address: 10.96.0.1
    
    [root@master1 ~]#
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    测试nginx svc以及Pod内部网络通信是否正常 ,分别在三台机器上进行下面操作

    ping 10.104.115.26 #nginx svc ip
    ping 10.244.1.2 #podIP
    
    • 1
    • 2

    如果成功ping同说明node跟pod的网络已经打通了。否则检查kube-proxy的模式是否正确。

    nodes/集群内部 无法访问ClusterIP

    默认情况下,我们部署的kube-proxy通过查看日志,能看到如下信息:Flag proxy-mode="" unknown,assuming iptables proxy
    原因分析:
    并没有正确使用ipvs模式
    解决方法:
    1、 在master上修改kube-proxy的配置文件,添加mode ipvs

    [root@master1 ~]# kubectl edit cm kube-proxy -n kube-system
    
    ipvs:
          excludeCIDRs: null
          minSyncPeriod: 0s
          scheduler: ""
          strictARP: false
          syncPeriod: 30s
        kind: KubeProxyConfiguration
        metricsBindAddress: 127.0.0.1:10249
        mode: "ipvs"
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    删除原来的POD,会自动重启kube-proxy 的pod

    [root@k8s-master ~]# kubectl get pod -n kube-system | grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'
    
    • 1

    扩展

    在使用过程中发现kubectl 命令不能补全,使用起来很不方便。为了提高使用kubectl命令工具的便捷性,介绍一下kubectl命令补全工具的安装。
    1、安装bash-completion:

    yum install -y bash-completion 
    source /usr/share/bash-completion/bash_completion
    
    • 1
    • 2

    2、 应用kubectl的completion到系统环境:

    source <(kubectl completion bash)
    echo "source <(kubectl completion bash)" >> ~/.bashrc
    
    • 1
    • 2

    3、效果展示

  • 相关阅读:
    zookeeper的安装与配置和启动闪退问题的解决(win)
    【数据结构】红黑树
    k8s集群安装Ingress,KubeSphere可视化界面安装K8s
    力扣647-回文字符串——中心扩展法
    一段程序的穷途一生
    YOLO V1学习笔记
    一码跑遍众多小程序,饿了么开源自研多端框架 MorJS
    spring boot利用redis作为缓存
    Docker-compose容器群集编排管理工具
    正交序列扩频_解扩
  • 原文地址:https://blog.csdn.net/sinat_28521487/article/details/126057006