Article

k8s(四)安装k8s集群

k8s(四)安装k8s集群

kubeadm init, kubeadm join

作者:lomtom

个人网站:lomtom.cn 🔗

个人公众号:博思奥园 🔗

你的支持就是我最大的动力。

k8s 系列:

  1. k8s(一)走进 docker
  2. k8s(二)Docker 的 HelloWorld
  3. k8s(三)走进 k8s
  4. k8s(四)安装 k8s 集群
  5. k8s(五)k8s 的 HelloWorld
  6. k8s(六)走进 Pod

使用部署工具安装集群有三种方式:

  1. 使用 kubeadm 引导集群 🔗
  2. 使用 Kops 安装 Kubernetes 🔗
  3. 使用 Kubespray 安装 Kubernetes 🔗

原理

这里以 kubeadm 为例,安装 kubernetes 1.23.1。

使用 kubeadm 安装 kubernetes 的核心其实只有两步:

# 创建一个Master节点
$ kubeadm init

# 将一个Node节点加入到当前集群中
$ kubeadm join <Master节点的IP和端口>

即:创建 Master 节点,并且将 Node 节点加入到集群中。其他的步骤都是为这两步做准备。

kubeadm init

在执行 kubeadm init命令的同时,kubeadm 为我们做了很多事情,例如安装前的预检查、生成证书以及生成一些必要的组件等等。

  1. 预检查其实包括很多步骤

    • 检查 Linux 内核的版本必须是否是 3.10 以上,可使用cat /proc/version命令查看。
    • 检查 Linux Cgroups 模块是否可用?
    • 用户户安装的 kubeadm 和 kubelet 的版本是否兼容
    • Containerd/Docker 是否已经安装?
  2. 证书生成,通常保存在 Master 节点的 /etc/kubernetes/pki 目录下。

  3. 安装必要的组件,Master 节点中的 API Server、Scheduler、Controller manager、ectl 就是在这个时候被 kubeadm 以 pod 的形式部署起来的。

    首先 kubeadm 会生成相对应的 yaml 描述文件(存在于/etc/kubernetes/manifests),并且以一种特殊的方式“静态 pod”的方式进行启动。

    [root@master ~]# ls /etc/kubernetes/manifests
    etcd.yaml  kube-apiserver.yaml  kube-controller-manager.yaml  kube-scheduler.yaml
    

    静态 Pod 总是由 kubelet 创建的,并且总在 kubelet 所在的 Node(这里就是 Master)上运行。

    当然,我们也可以以自定义的方式,修改这些 pod 的启动参数,并且在 init 时指定配置文件即可,例如:kubeadm init --config=kubeadm-init.yaml

  4. 在完成 Master 组件的健康检查后,kubeadm 就会为集群生成一个 bootstrap token,通过该 token,就可以允许其他的节点加入到这个集群了。

  5. 最后一步,Kubernetes 会默认 kube-proxy 和 DNS 这两个插件。它们分别用来提供整个集群的服务发现和 DNS 功能。

kubeadm join

kubeadm join 的原理就是通过 master 节点的 token 以一种安全的方式连接到 Master 节点的 Apiserver 上即可。

可是,为什么执行 kubeadm join 需要这样一个 token 呢?

因为,任何一台机器想要成为 Kubernetes 集群中的一个节点,就必须在集群的 kube-apiserver 上注册。可是,要想跟 apiserver 打交道,这台机器就必须要获取到相应的证书文件(CA 文件)。可是,为了能够一键安装,我们就不能让用户去 Master 节点上手动拷贝这些文件。所以,kubeadm 至少需要发起一次“不安全模式”的访问到 kube-apiserver,从而拿到保存在 ConfigMap 中的 cluster-info(它保存了 APIServer 的授权信息)。而 bootstrap token,扮演的就是这个过程中的安全验证的角色。

安装

前提准备

  1. 本次使用两台主机搭建 K8s 集群,并且两台主机是可以互相连通的。
  2. 能够访问外网,因为需要拉取必要镜像
  3. 安装 Linux 系统,且内核版本在 3.10 及以上
操作系统主机名IP
centos7.9.2003(最小化安装)master8.16.0.67
centos7.9.2003(最小化安装)slaver8.16.0.66

安装步骤

  1. 安装 master
    1. 配置环境
    2. 安装 containerd
    3. 安装 kubectl、kubelet、kubeadm 工具
    4. 进行 kubeadm init
    5. 安装网络
  2. 安装 node(同 master,有小部分差别)
  3. 将 node 与 master 进行 join

Master

  1. 配置环境

    配置环境包括配置 hosts,关闭一些不必要的服务。

    #设置主机名
    hostnamectl set-hostname master
    
    #添加hosts解析
    cat >> /etc/hosts << EOF
    8.16.0.67 master
    8.16.0.66 slaver
    EOF
    
    ping -c4 master
    
    #同步时间
    yum -y install ntp
    
    systemctl start ntpd && systemctl enable ntpd && systemctl status ntpd
    
    #关闭防火墙
    systemctl stop firewalld && systemctl disable firewalld && systemctl status firewalld
    
    #永久关闭seLinux(需重启系统生效)
    setenforce 0
    sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
    
    #关闭swap
    swapoff -a  # 临时关闭
    sed -i 's/.*swap.*/#&/g' /etc/fstab
    
    #加载IPVS模块
    yum -y install ipset ipvsadm
    
    cat > /etc/sysconfig/modules/ipvs.modules <<EOF
    modprobe -- ip_vs
    modprobe -- ip_vs_rr
    modprobe -- ip_vs_wrr
    modprobe -- ip_vs_sh
    modprobe -- nf_conntrack_ipv4
    EOF
    
    chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
    
    • Q1:为什么需要关闭防火墙?

      A1:防止产生重复的防火墙规则

    • Q2:为什么需要关闭 seLinux?

      A2:允许容器访问宿主机的文件系统

    • Q3:为什么需要关闭 swap?

      A3:issue 🔗 中提及 有保证的 pod 永远不需要交换。Burstable pod 应该在不需要交换的情况下满足它们的请求。并且他们不考虑支持 swap。🥲 但是在 1.22 开始,k8s 支持 🔗 alpha swap

  2. 安装containerd

    可以将containerd换成docker,因为docker附带了containerd(文章结尾附带了 Docker 版),containerd 即将成为趋势。

    cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
    overlay
    br_netfilter
    EOF
    
    # 载入必要模块
    sudo modprobe overlay
    sudo modprobe br_netfilter
    
    cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
    net.bridge.bridge-nf-call-iptables  = 1
    net.ipv4.ip_forward                 = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    EOF
    
    sudo sysctl --system
    
    yum install -y wget
    
    # 配置软件源
    wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
    
    # yum list |grep containerd
    # 安装containerd
    yum -y install containerd.io.x86_64
    
    mkdir -p /etc/containerd
    containerd config default | sudo tee /etc/containerd/config.toml
    
    # 使用 systemd cgroup 驱动程序
    sed -i '/runc.options/a\            SystemdCgroup = true' /etc/containerd/config.toml && \
    grep 'SystemdCgroup = true' -B 7 /etc/containerd/config.toml
    
    # 更改sandbox_image
    sed -ri 's#k8s.gcr.io\/pause:3.2#registry.aliyuncs.com\/google_containers\/pause:3.6#' /etc/containerd/config.toml
    
    # endpoint位置添加阿里云的镜像源
    sed -ri 's#https:\/\/registry-1.docker.io#https:\/\/registry.aliyuncs.com#' /etc/containerd/config.toml
    
    systemctl daemon-reload
    systemctl enable containerd --now
    systemctl status containerd
    

    Tips:启动可能会有问题,是因为 sed 命令没有生效,那么可以手动修改/etc/containerd/config.toml,增加endpointsandbox_image值,查看SystemdCgroup是否重复。

          [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
            [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
              endpoint = ["https://registry.aliyuncs.com"]
    
    
       [plugins."io.containerd.grpc.v1.cri"]
        sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"
    

    cgroups 是 docker 使用的核心技术之一,其名称源自控制组群(英语:control groups)的简写,是 Linux 内核的一个功能,用来限制、控制与分离一个进程组的资源(如 CPU、内存、磁盘输入输出等)。

  3. 安装 kubectl、kubelet、kubeadm 工具

    • kubeadm:用来初始化集群的指令。
    • kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
    • kubectl:用来与集群通信的命令行工具。
    cat > /etc/yum.repos.d/kubernetes.repo <<EOF
    [kubernetes]
    name=Kubernetes
    baseurl=https://mirrors	.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
    enabled=1
    gpgcheck=0
    EOF
    
    yum list kubeadm --showduplicates | sort -r
    
    yum -y install kubeadm-1.23.1-0 kubelet-1.23.1-0 kubectl-1.23.1-0
    
    systemctl enable --now kubelet
    
    systemctl status kubelet
    

    Tips:执行systemctl enable --now kubelet可能会无法启动,kubelet 现在每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环。执行第四步后,再查看状态。

  4. kubeadm 初始化及安装网络

    #设置crictl
    cat << EOF >> /etc/crictl.yaml
    runtime-endpoint: unix:///var/run/containerd/containerd.sock
    image-endpoint: unix:///var/run/containerd/containerd.sock
    timeout: 10
    debug: false
    EOF
    
    mkdir ~/kubeadm_init && cd ~/kubeadm_init
    kubeadm init
    # 定义初始化文件
    kubeadm config print init-defaults > kubeadm-init.yaml
    
    cat > kubeadm-init.yaml << EOF
    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: 8.16.0.67
      bindPort: 6443
    nodeRegistration:
      criSocket: /run/containerd/containerd.sock
      name: master
      taints:
      - effect: "NoSchedule"
        key: "node-role.kubernetes.io/master"
    ---
    apiServer:
      timeoutForControlPlane: 4m0s
    apiVersion: kubeadm.k8s.io/v1beta2
    certificatesDir: /etc/kubernetes/pki
    clusterName: kubernetes
    controllerManager: {}
    dns:
      type: CoreDNS
    etcd:
      local:
        dataDir: /var/lib/etcd
    imageRepository: registry.aliyuncs.com/google_containers
    kind: ClusterConfiguration
    kubernetesVersion: v1.23.1
    networking:
      dnsDomain: cluster.local
      serviceSubnet: 10.96.0.0/12
      podSubnet: 10.244.0.0/16
    scheduler: {}
    ---
    apiVersion: kubeproxy.config.k8s.io/v1alpha1
    kind: KubeProxyConfiguration
    mode: ipvs
    ---
    apiVersion: kubelet.config.k8s.io/v1beta1
    kind: KubeletConfiguration
    cgroupDriver: systemd
    EOF
    
    # 查看所需镜像列表
    kubeadm config images list --config kubeadm-init.yaml
    
    # 预拉取镜像
    kubeadm config images pull --config kubeadm-init.yaml
    
    ctr -n k8s.io i ls -q
    
    crictl images
    
    crictl ps -a
    
    # 执行kubeadm初始化
    kubeadm init --config=kubeadm-init.yaml
    
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
    # 安装网络
    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    

    Tips:

    1. crictlcontainerd兼容的容器运行时命令行接口,可以使用它来检查和调试 k8s 节点上的容器运行时和应用程序。
    2. init 后会生成 join 语句kubeadm join 8.16.0.67:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:db42cac7470d6df1bb187db2aa89f9204f7de13d1ca28abc435d462bf72e651c

Slaver

  1. 参考 Master

  2. 参考 Master

  3. 参考 Master

  4. 参考 Master

    #设置crictl
    cat << EOF >> /etc/crictl.yaml
    runtime-endpoint: unix:///var/run/containerd/containerd.sock
    image-endpoint: unix:///var/run/containerd/containerd.sock
    timeout: 10
    debug: false
    EOF
    
    
    # 拉取镜像
    crictl pull registry.aliyuncs.com/google_containers/kube-proxy:v1.23.1
    crictl pull registry.aliyuncs.com/google_containers/pause:3.6
    
    ctr -n k8s.io i ls -q
    
    crictl images
    
    crictl ps -a
    
    mkdir -p $HOME/.kube
    sudo cp -i master:/etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    

Join

join 操作将 slaver 节点加入到集群中。

  1. 生成永久 token,生成的 token 类似:q7zp90.hywock1tphsdrvkq,然后他就会生成一条默认的 join 语句。

    kubeadm token create --ttl 0 --print-join-command
    

    使用kubeadm token list查看所有 token

    [root@master k8s]# kubeadm token list
    TOKEN                     TTL         EXPIRES   USAGES                   DESCRIPTION                                                EXTRA GROUPS
    q7zp90.hywock1tphsdrvkq   <forever>   <never>   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token
    
  2. 进行 join

    使用第一步生成 join 语句直接在 node 节点上执行

    kubeadm join 8.16.0.67:6443 --token q7zp90.hywock1tphsdrvkq     --discovery-token-ca-cert-hash sha256:266cfd8963dbefe1cfa0b2c965896d185182133b908d2d24c6f214356e1822fc
    

    认证方式参考:kubeadm join 🔗

测试

至此大功就告成啦。🎉🎉🎉

可以采用kubectl get node -o wide命令查看所有节点

[root@master k8s]# kubectl get node
NAME     STATUS   ROLES                  AGE   VERSION
master   Ready    control-plane,master   2d    v1.23.1
slaver   Ready    <none>                 44h   v1.23.1

那就安装一个 nginx 来测试一下吧。

创建一个 nginx 的 deployment 并且将其 expose 对外暴露。

kubectl create deployment nginx --image=nginx

kubectl expose deployment nginx --port=80 --type=NodePort

等待一段时间,安装完成后,deployment、pod、service 将会各生成一个。

使用kubectl get svc,pod,deploy -o wide便可查看

[root@master k8s]# kubectl get svc,pod,deploy
NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        2d
service/nginx        NodePort    10.109.59.210   <none>        80:31732/TCP   33h

NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-85b98978db-9z9ck   1/1     Running   0          33h

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   1/1     1            1           33h

访问 nginx 地址,成功

image-20220413200629886

Tips

  1. 重置 kubeadm 安装状态

    kubeadm reset
    
    rm -fr  $HOME/.kube/config
    
  2. 在拉取镜像的时候如果连接超时,可以选择国内镜像源(例如阿里),加上参数--image-repository=registry.aliyuncs.com/google_containers即可

    kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers
    
    kubeadm init --image-repository=registry.aliyuncs.com/google_containers
    
  3. 在执行kubeadm init后,节点处于 NotReady,这是符合预期的。

    使用kubectl describe node master即可查看 master 节点信息,他会告诉我们network plugin is not ready: cni config uninitialized

    因为没有安装网络,所有 DNS 服务一起起不来,安装网络服务即可(这里是 flannel)。

    [root@master kubeadm_init]# kubectl get pods --all-namespaces
    NAMESPACE     NAME                             READY   STATUS    RESTARTS        AGE
    kube-system   coredns-6d8c4cb4d-2fbpp          0/1     Pending   0               2m40s
    kube-system   coredns-6d8c4cb4d-g8jzg          0/1     Pending   0               2m40s
    kube-system   etcd-master                      1/1     Running   1 (6m23s ago)   3m2s
    kube-system   kube-apiserver-master            1/1     Running   1 (6m32s ago)   2m58s
    kube-system   kube-controller-manager-master   1/1     Running   1 (3m26s ago)   2m55s
    kube-system   kube-proxy-tdz44                 1/1     Running   0               2m40s
    kube-system   kube-scheduler-master            1/1     Running   1 (3m53s ago)   2m59s
    
    # 安装flannel后
    [root@master kubeadm_init]# kubectl get pods --all-namespaces
    NAMESPACE     NAME                             READY   STATUS    RESTARTS        AGE
    kube-system   coredns-6d8c4cb4d-2fbpp          1/1     Running   0               8m48s
    kube-system   coredns-6d8c4cb4d-g8jzg          1/1     Running   0               8m48s
    kube-system   etcd-master                      1/1     Running   1 (12m ago)     9m10s
    kube-system   kube-apiserver-master            1/1     Running   1 (12m ago)     9m6s
    kube-system   kube-controller-manager-master   1/1     Running   1 (9m34s ago)   9m3s
    kube-system   kube-flannel-ds-7gm8n            1/1     Running   0               57s
    kube-system   kube-proxy-tdz44                 1/1     Running   0               8m48s
    kube-system   kube-scheduler-master            1/1     Running   1 (10m ago)     9m7s
    

    1)获取 flannel:wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml 🔗

    2)获取镜像:grep image kube-flannel.yml

    [root@maste k8s]# grep image kube-flannel.yml
           #image: flannelcni/flannel-cni-plugin:v1.0.1 for ppc64le and mips64le (dockerhub limitations may apply)
            image: rancher/mirrored-flannelcni-flannel-cni-plugin:v1.0.1
           #image: flannelcni/flannel:v0.17.0 for ppc64le and mips64le (dockerhub limitations may apply)
            image: rancher/mirrored-flannelcni-flannel:v0.17.0
           #image: flannelcni/flannel:v0.17.0 for ppc64le and mips64le (dockerhub limitations may apply)
    

    3)Master:kubecetl create -f kube-flannel.yml

    4)Node:

    crictl pull flannelcni/flannel-cni-plugin:v1.0.1
    crictl pull flannelcni/flannel:v0.17.0
    
  4. Master 节点执行systemctl enable --now kubelet后,kubelet 可能会起不来,等kubeadm init执行成功后,就会自动起来了。

  5. 让 node 节点使用 kubectl 命令行工具

    mkdir -p $HOME/.kube
    scp master:/$HOME/.kube/config $HOME/.kube/config
    
    chown $(id -u):$(id -g) $HOME/.kube/config
    
    mkdir -p $HOME/.kube
    scp master:/etc/kubernetes/admin.conf $HOME/.kube/config
    
    chown $(id -u):$(id -g) $HOME/.kube/config
    
  6. 如果想要可视化,这里有两种方法

    • 使用dashboard 🔗

      kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc6/aio/deploy/recommended.yaml
      
    • 使用lens 🔗 (推荐)

  7. 阿里云 ecs 里没有配置公网 ip,etcd 无法启动,所以 kubeadm 在初始化会出现”timeout“的错误

    解决办法就是给你的服务器版定一个公网 ip。

  8. 想要优雅的使用 k 命令,而不每次都输入kubectl。可以在每次 ssh 连接后执行

    function k() {
        cmdline=`HISTTIMEFORMAT="" history | awk '$2 == "kubectl" && (/-n/ || /--namespace/) {for(i=2;i<=NF;i++)printf("%s ",$i);print ""}' | tail -n 1`
        regs=('\-n [\w\-\d]+' '\-n=[\w\-\d]+' '\-\-namespace [\w\-\d]+' '\-\-namespace=[\w\-\d]+')
        for i in "${!regs[@]}"; do
            reg=${regs[i]}
            nsarg=`echo $cmdline | grep -o -P "$reg"`
            if [[ "$nsarg" == "" ]]; then
                continue
            fi
            cmd="kubectl $nsarg $@"
            echo "$cmd"
            $cmd
            return
        done
        cmd="kubectl $@"
        echo "$cmd"
        $cmd
    }
    

    如果不想要每次都手动执行可以设置为 ssh 登陆后自动执行: 编辑 ~/.bashrc

    if [[ -n $SSH_CONNECTION ]] ; then
        function k() {
        cmdline=`HISTTIMEFORMAT="" history | awk '$2 == "kubectl" && (/-n/ || /--namespace/) {for(i=2;i<=NF;i++)printf("%s ",$i);print ""}' | tail -n 1`
        regs=('\-n [\w\-\d]+' '\-n=[\w\-\d]+' '\-\-namespace [\w\-\d]+' '\-\-namespace=[\w\-\d]+')
        for i in "${!regs[@]}"; do
            reg=${regs[i]}
            nsarg=`echo $cmdline | grep -o -P "$reg"`
            if [[ "$nsarg" == "" ]]; then
                continue
            fi
            cmd="kubectl $nsarg $@"
            echo "$cmd"
            $cmd
            return
        done
        cmd="kubectl $@"
        echo "$cmd"
        $cmd
    }
    fi
    

docker 版

  1. master
#!/bin/bash

startTime=`date +%Y%m%d-%H:%M:%S`
startTime_s=`date +%s`
#1、环境准备

#设置主机名
hostnamectl set-hostname master

#添加hosts解析
cat >> /etc/hosts << EOF
8.16.0.100 master
8.16.0.101 slaver
EOF

ping -c2 master
ping -c2 slaver

#同步时间
yum -y install ntp

systemctl start ntpd && systemctl enable ntpd && systemctl status ntpd

#关闭防火墙
systemctl stop firewalld && systemctl disable firewalld && systemctl status firewalld

#永久关闭seLinux(需重启系统生效)
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

#关闭swap
swapoff -a  # 临时关闭
sed -i 's/.*swap.*/#&/g' /etc/fstab

#加载IPVS模块
yum -y install ipset ipvsadm

cat > /etc/sysconfig/modules/ipvs.modules <<EOF
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
EOF

kernel_version=$(uname -r | cut -d- -f1)
echo $kernel_version

if [ `expr $kernel_version \> 4.19` -eq 1 ]
    then
        modprobe -- nf_conntrack
    else
        modprobe -- nf_conntrack_ipv4
fi

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack

#2、部署docker
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

# 1.20+需要开启br_netfilter
sudo modprobe overlay
sudo modprobe br_netfilter

cat <<EOF | sudo tee ca
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

sudo sysctl --system

yum install -y wget

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O ca

yum -y install docker-ce-19.03.15 docker-ce-cli-19.03.15

systemctl daemon-reload

systemctl enable docker --now

systemctl status docker

cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://7vnz06qj.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
  "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
    ]
}
EOF

systemctl daemon-reload && systemctl restart docker

#3、Kubernetes部署
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF

yum -y install kubeadm-1.19.16-0 kubelet-1.19.16-0 kubectl-1.19.16-0

systemctl enable --now kubelet

systemctl status kubelet

mkdir ~/kubeadm_init && cd ~/kubeadm_init

kubeadm config print init-defaults > kubeadm-init.yaml

cat > kubeadm-init.yaml << EOF
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authenticatioca
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 8.16.0.100
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: master
  taints:
  - effect: "NoSchedule"
    key: "node-role.kubernetes.io/master"
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.19.16
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  podSubnet: 10.244.0.0/16
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
EOF

# 预拉取镜像
kubeadm config images pull --config kubeadm-init.yaml

kubeadm init --config=kubeadm-init.yaml | tee kubeadm-init.log

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

kubectl get node -owide
endTime=`date +%Y%m%d-%H:%M:%S`
endTime_s=`date +%s`

sumTime=$[ $endTime_s - $startTime_s ]

echo "$startTime ---> $endTime" "Total:$sumTime seconds"
  1. slaver
#!/bin/bash

startTime=`date +%Y%m%d-%H:%M:%S`
startTime_s=`date +%s`
#1、环境准备

#设置主机名
hostnamectl set-hostname slaver

#添加hosts解析
cat >> /etc/hosts << EOF
8.16.0.100 master
8.16.0.101 slaver
EOF

ping -c2 master
ping -c2 slaver

#同步时间
yum -y install ntp

systemctl start ntpd && systemctl enable ntpd && systemctl status ntpd

#关闭防火墙
systemctl stop firewalld && systemctl disable firewalld && systemctl status firewalld

#永久关闭seLinux(需重启系统生效)
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

#关闭swap
swapoff -a  # 临时关闭
sed -i 's/.*swap.*/#&/g' /etc/fstab

#加载IPVS模块
yum -y install ipset ipvsadm

cat > /etc/sysconfig/modules/ipvs.modules <<EOF
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
EOF

kernel_version=$(uname -r | cut -d- -f1)
echo $kernel_version

if [ `expr $kernel_version \> 4.19` -eq 1 ]
    then
        modprobe -- nf_conntrack
    else
        modprobe -- nf_conntrack_ipv4
fi

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack

#2、部署docker
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

# 1.20+需要开启br_netfilter
sudo modprobe overlay
sudo modprobe br_netfilter

cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

sudo sysctl --system

yum install -y wget

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

yum -y install docker-ce-19.03.15 docker-ce-cli-19.03.15

systemctl daemon-reload

systemctl enable docker --now

systemctl status docker

cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://7vnz06qj.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
  "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
    ]
}
EOF

systemctl daemon-reload && systemctl restart docker

#3、Kubernetes部署
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF

yum -y install kubeadm-1.19.16-0 kubelet-1.19.16-0 kubectl-1.19.16-0

systemctl enable --now kubelet

systemctl status kubelet

本章节安装 k8s 脚本由大佬 🔗提供

Copyright

本文为原创内容,欢迎分享与引用,请保留作者与原文链接。

文章标题

k8s(四)安装k8s集群

作者

lomtom

发布方式

原创发布

原文链接 https://lomtom.cn/33fe8d4a
More Reads