k8s(九)安装K8s集群之master

219 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情

安装

前提准备

  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
    EOFchmod 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