关于kubernetes:使用kubeadm安装kubernetes-121

42次阅读

共计 9377 个字符,预计需要花费 24 分钟才能阅读完成。

文章原文

配置要求

  • 至多 2 台 2 核 4G 的服务器
  • 本文档中,CPU 必须为 x86 架构
  • CentOS 7.8 或 CentOS Stream 8

    装置后的软件版本为

  • Kubernetes v1.21.x

    • calico 3.17.1
    • nginx-ingress 1.9.1
  • Containerd.io 1.4.3

    操作系统兼容性

    CentOS 版本 本文档是否兼容 备注
    CentOS Stream 8 😄 已验证
    CentOS 7.8 😄 已验证
    CentOS 7.7 😞 未验证
    CentOS 7.6 😞 未验证

{{< notice success “Container Runtime” >}}

  • Kubernetes v1.21 开始,默认移除 docker 的依赖,如果宿主机上安装了 docker 和 containerd,将优先应用 docker 作为容器运行引擎,如果宿主机上未装置 docker 只装置了 containerd,将应用 containerd 作为容器运行引擎;
  • 本文应用 containerd 作为容器运行引擎;
    {{< /notice >}}

{{< notice success “ 对于二进制安 ” >}}

  • kubeadm 是 Kubernetes 官网反对的装置形式,“二进制”不是。本文档采纳 kubernetes.io 官网举荐的 kubeadm 工具装置 kubernetes 集群。
    {{< /notice >}}

    查看 centos / hostname

    # 在 master 节点和 worker 节点都要执行
    cat /etc/redhat-release
    
    # 此处 hostname 的输入将会是该机器在 Kubernetes 集群中的节点名字
    # 不能应用 localhost 作为节点的名字
    hostname
    
    # 请应用 lscpu 命令,核查 CPU 信息
    # Architecture: x86_64    本装置文档不反对 arm 架构
    # CPU(s):       2         CPU 内核数量不能低于 2
    lscpu

    批改 hostname

    # 批改 hostname
    hostnamectl set-hostname your-new-host-name
    # 查看批改后果
    hostnamectl status
    # 设置 hostname 解析
    echo "127.0.0.1   $(hostname)" >> /etc/hosts
    

    查看网络

    在所有节点执行命令

    [root@demo-master-a-1 ~]$ ip route show
    default via 172.21.0.1 dev eth0 
    169.254.0.0/16 dev eth0 scope link metric 1002 
    172.21.0.0/20 dev eth0 proto kernel scope link src 172.21.0.12 
    
    [root@demo-master-a-1 ~]$ ip address
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
      link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
      inet 127.0.0.1/8 scope host lo
         valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
      link/ether 00:16:3e:12:a4:1b brd ff:ff:ff:ff:ff:ff
      inet 172.17.216.80/20 brd 172.17.223.255 scope global dynamic eth0
         valid_lft 305741654sec preferred_lft 305741654sec

    {{< notice info “kubelet 应用的 IP 地址 ” >}}

  • ip route show 命令中,能够晓得机器的默认网卡,通常是 eth0,如 default via 172.21.0.23 dev eth0
  • ip address 命令中,可显示默认网卡的 IP 地址,Kubernetes 将应用此 IP 地址与集群内的其余节点通信,如 172.17.216.80
  • 所有节点上 Kubernetes 所应用的 IP 地址必须能够互通(无需 NAT 映射、无平安组或防火墙隔离)
    {{< /notice >}}

    装置

    {{< notice warning “” >}}
    应用 root 身份在所有节点执行如下代码,以装置软件:

  • containerd
  • nfs-utils
  • kubectl / kubeadm / kubelet
    {{< /notice >}}
    {{< tabs 疾速装置 手动装置 >}}
    {{< tab >}}
    请将脚本最初的 1.21.0 替换成您须要的版本号(必须是 1.21 的小版本,不能是 1.19.1 等) 脚本两头的 v1.21.x 不要替换

docker hub 镜像请依据本人网络的状况任选一个

  • 第四行为腾讯云 docker hub 镜像
  • 第六行为 DaoCloud docker hub 镜像
  • 第八行为华为云 docker hub 镜像
  • 第十行为阿里云 docker hub 镜像

    # 在 master 节点和 worker 节点都要执行
    # 最初一个参数 1.21.0 用于指定 kubenetes 版本,反对所有 1.21.x 版本的装置
    # 腾讯云 docker hub 镜像
    # export REGISTRY_MIRROR="https://mirror.ccs.tencentyun.com"
    # DaoCloud 镜像
    # export REGISTRY_MIRROR="http://f1361db2.m.daocloud.io"
    # 华为云镜像
    # export REGISTRY_MIRROR="https://05f073ad3c0010ea0f4bc00b7105ec20.mirror.swr.myhuaweicloud.com"
    # 阿里云 docker hub 镜像
    export REGISTRY_MIRROR=https://registry.cn-hangzhou.aliyuncs.com
    curl -sSL https://kuboard.cn/install-script/v1.21.x/install_kubelet.sh | sh -s 1.21.0

    {{< /tab >}}
    {{< tab >}}
    手动执行以下代码,后果与疾速装置雷同。 请将脚本第 79 行(已高亮)的 ${1} 替换成您须要的版本号,例如 1.21.0

docker hub 镜像请依据本人网络的状况任选一个

  • 第四行为腾讯云 docker hub 镜像
  • 第六行为 DaoCloud docker hub 镜像
  • 第八行为阿里云 docker hub 镜像

    # 在 master 节点和 worker 节点都要执行
    # 最初一个参数 1.21.0 用于指定 kubenetes 版本,反对所有 1.21.x 版本的装置
    # 腾讯云 docker hub 镜像
    # export REGISTRY_MIRROR="https://mirror.ccs.tencentyun.com"
    # DaoCloud 镜像
    # export REGISTRY_MIRROR="http://f1361db2.m.daocloud.io"
    # 阿里云 docker hub 镜像
    export REGISTRY_MIRROR=https://registry.cn-hangzhou.aliyuncs.com
    #!/bin/bash
    
    # 在 master 节点和 worker 节点都要执行
    
    # 装置 containerd
    # 参考文档如下
    # https://kubernetes.io/docs/setup/production-environment/container-runtimes/#containerd
    
    cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
    overlay
    br_netfilter
    EOF
    
    sudo modprobe overlay
    sudo modprobe br_netfilter
    
    # Setup required sysctl params, these persist across reboots.
    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
    
    # Apply sysctl params without reboot
    sysctl --system
    
    # 卸载旧版本
    yum remove -y containerd.io
    
    # 设置 yum repository
    yum install -y yum-utils device-mapper-persistent-data lvm2
    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    
    # 装置 containerd
    yum install -y containerd.io-1.4.3
    
    mkdir -p /etc/containerd
    containerd config default > /etc/containerd/config.toml
    
    sed -i "s#k8s.gcr.io#registry.aliyuncs.com/k8sxio#g"  /etc/containerd/config.toml
    sed -i '/containerd.runtimes.runc.options/a\ \ \ \ \ \ \ \ \ \ \ \ SystemdCgroup = true' /etc/containerd/config.toml
    sed -i "s#https://registry-1.docker.io#${REGISTRY_MIRROR}#g"  /etc/containerd/config.toml
    
    
    systemctl daemon-reload
    systemctl enable containerd
    systemctl restart containerd
    
    
    # 装置 nfs-utils
    # 必须先装置 nfs-utils 能力挂载 nfs 网络存储
    yum install -y nfs-utils
    yum install -y wget
    
    # 敞开 防火墙
    systemctl stop firewalld
    systemctl disable firewalld
    
    # 敞开 SeLinux
    setenforce 0
    sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
    
    # 敞开 swap
    swapoff -a
    yes | cp /etc/fstab /etc/fstab_bak
    cat /etc/fstab_bak |grep -v swap > /etc/fstab
    
    # 配置 K8S 的 yum 源
    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
    
    # 卸载旧版本
    yum remove -y kubelet kubeadm kubectl
    
    # 装置 kubelet、kubeadm、kubectl
    # 将 ${1} 替换为 kubernetes 版本号,例如 1.20.1
    yum install -y kubelet-${1} kubeadm-${1} kubectl-${1}
    
    crictl config runtime-endpoint /run/containerd/containerd.sock
    
    # 重启 docker,并启动 kubelet
    systemctl daemon-reload
    systemctl enable kubelet && systemctl start kubelet
    
    containerd --version
    kubelet --version

    {{< notice warning “ 留神 ” >}}
    如果此时执行 systemctl status kubelet 命令,将失去 kubelet 启动失败的谬误提醒,请疏忽此谬误,因为必须实现后续步骤中 kubeadm init 的操作,kubelet 能力失常启动
    {{< /notice >}}
    {{< /tab >}}
    {{< /tabs >}}

初始化 master 节点

{{< notice warning “ 对于初始化时用到的环境变量 ” >}}

  • APISERVER_NAME 不能是 master 的 hostname
  • APISERVER_NAME 必须全为小写字母、数字、小数点,不能蕴含减号
  • POD_SUBNET 所应用的网段不能与 master 节点 /worker 节点 所在的网段重叠。该字段的取值为一个 CIDR 值,如果您对 CIDR 这个概念还不相熟,请依然执行 export POD_SUBNET=10.100.0.1/16 命令,不做批改
    {{< /notice >}}

{{< tabs 疾速初始化 手动初始化 >}}
{{< tab >}}
请将脚本最初的 1.21.0 替换成您须要的版本号(必须是 1.21 的小版本,不能是 1.19.1 等) 脚本两头的 v1.21.x 不要替换

# 只在 master 节点执行
# 替换 x.x.x.x 为 master 节点理论 IP(请应用内网 IP)# export 命令只在以后 shell 会话中无效,开启新的 shell 窗口后,如果要持续装置过程,请从新执行此处的 export 命令
export MASTER_IP=x.x.x.x
# 替换 apiserver.demo 为 您想要的 dnsName
export APISERVER_NAME=apiserver.demo
# Kubernetes 容器组所在的网段,该网段装置实现后,由 kubernetes 创立,当时并不存在于您的物理网络中
export POD_SUBNET=10.100.0.1/16
echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts
curl -sSL https://kuboard.cn/install-script/v1.21.x/init_master.sh | sh -s 1.21.0

{{< /tab >}}
{{< tab >}}
手动执行以下代码,后果与疾速装置雷同。 请将脚本第 79 行(已高亮)的 ${1} 替换成您须要的版本号,例如 1.21.0

# 只在 master 节点执行
# 替换 x.x.x.x 为 master 节点的内网 IP
# export 命令只在以后 shell 会话中无效,开启新的 shell 窗口后,如果要持续装置过程,请从新执行此处的 export 命令
export MASTER_IP=x.x.x.x
# 替换 apiserver.demo 为 您想要的 dnsName
export APISERVER_NAME=apiserver.demo
# Kubernetes 容器组所在的网段,该网段装置实现后,由 kubernetes 创立,当时并不存在于您的物理网络中
export POD_SUBNET=10.100.0.1/16
echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts
#!/bin/bash

# 只在 master 节点执行

# 脚本出错时终止执行
set -e

if [${#POD_SUBNET} -eq 0 ] || [${#APISERVER_NAME} -eq 0 ]; then
  echo -e "\033[31;1m 请确保您曾经设置了环境变量 POD_SUBNET 和 APISERVER_NAME \033[0m"
  echo 以后 POD_SUBNET=$POD_SUBNET
  echo 以后 APISERVER_NAME=$APISERVER_NAME
  exit 1
fi


# 查看残缺配置选项 https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2
rm -f ./kubeadm-config.yaml
cat <<EOF > ./kubeadm-config.yaml
---
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v${1}
imageRepository: registry.aliyuncs.com/k8sxio
controlPlaneEndpoint: "${APISERVER_NAME}:6443"
networking:
  serviceSubnet: "10.96.0.0/16"
  podSubnet: "${POD_SUBNET}"
  dnsDomain: "cluster.local"
dns:
  type: CoreDNS
  imageRepository: swr.cn-east-2.myhuaweicloud.com${2}
  imageTag: 1.8.0

---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
EOF

# kubeadm init
# 依据您服务器网速的状况,您须要等待 3 - 10 分钟
echo ""echo" 抓取镜像,请稍候..."
kubeadm config images pull --config=kubeadm-config.yaml
echo ""echo" 初始化 Master 节点 "
kubeadm init --config=kubeadm-config.yaml --upload-certs

# 配置 kubectl
rm -rf /root/.kube/
mkdir /root/.kube/
cp -i /etc/kubernetes/admin.conf /root/.kube/config

# 装置 calico 网络插件
# 参考文档 https://docs.projectcalico.org/v3.13/getting-started/kubernetes/self-managed-onprem/onpremises
echo ""echo" 装置 calico-3.17.1"
rm -f calico-3.17.1.yaml
kubectl create -f https://kuboard.cn/install-script/v1.21.x/calico-operator.yaml
wget https://kuboard.cn/install-script/v1.21.x/calico-custom-resources.yaml
sed -i "s#192.168.0.0/16#${POD_SUBNET}#" calico-custom-resources.yaml
kubectl create -f calico-custom-resources.yaml

{{< /tab >}}
{{< /tabs >}}

查看 master 初始化后果

# 只在 master 节点执行

# 执行如下命令,期待 3-10 分钟,直到所有的容器组处于 Running 状态
watch kubectl get pod -n kube-system -o wide

# 查看 master 节点初始化后果
kubectl get nodes -o wide

初始化 worker 节点

取得 join 命令参数

在 master 节点上执行

# 只在 master 节点执行
kubeadm token create --print-join-command
# 返回如下
kubeadm join apiserver.demo:6443 --token 9ukzcs.qp4ozxbn1knc13sx --discovery-token-ca-cert-hash sha256:0cb945ea0c6329b4df58cf358e2be697fd31a85f55c23d47356f06f69a27283d 

{{< notice success “ 无效工夫 ” >}}
该 token 的无效工夫为 2 个小时,2 小时内,您能够应用此 token 初始化任意数量的 worker 节点。
{{< /notice >}}

初始化 worker

针对所有的 worker 节点执行

# 只在 worker 节点执行
# 替换 x.x.x.x 为 master 节点的内网 IP
export MASTER_IP=x.x.x.x
# 替换 apiserver.demo 为初始化 master 节点时所应用的 APISERVER_NAME
export APISERVER_NAME=apiserver.demo
echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts

# 替换为 master 节点上 kubeadm token create 命令的输入
kubeadm join apiserver.demo:6443 --token 9ukzcs.qp4ozxbn1knc13sx --discovery-token-ca-cert-hash sha256:0cb945ea0c6329b4df58cf358e2be697fd31a85f55c23d47356f06f69a27283d 

查看初始化后果

在 master 节点上执行

# 只在 master 节点执行
kubectl get nodes -o wide
# 输入后果如下所示
[root@master ~]# kubectl get nodes
NAME     STATUS   ROLES                  AGE   VERSION
master   Ready    control-plane,master   54m   v1.21.0
node1    Ready    <none>                 35m   v1.21.0

装置 Ingress Controller

{{< tabs 疾速装置 卸载 IngressController >}}
{{< tab >}}
在 master 节点上执行
局部状况下,上面的这条指令,您须要执行两次能力胜利。

# 只在 master 节点执行
kubectl apply -f https://kuboard.cn/install-script/v1.21.x/nginx-ingress.yaml

{{< /tab >}}
{{< tab >}}
在 master 节点上执行

只在您想抉择其余 Ingress Controller 的状况下卸载

# 只在 master 节点执行
kubectl delete -f https://kuboard.cn/install-script/v1.21.x/nginx-ingress.yaml

{{< /tab >}}
{{< /tabs >}}

配置域名解析

将域名 cnsre.cn 解析到 demo-worker-a-2 的 IP 地址 z.z.z.z(也能够是 demo-worker-a-1 的地址 y.y.y.y)

验证配置

在浏览器拜访 cnsre.cn,将失去 404 NotFound 谬误页面
文章原文

正文完
 0