kubeadm 部署 k8s

发布时间 2023-10-17 16:33:28作者: 南风丶轻语

kubeadm 部署 k8s

简介

记录在centos7.6.1810上,使用kubeadm 部署 k8s,部署在三台虚机上,部署版本是1.22.0

虚机信息

使用三台一模一样的虚机,系统版本为 CentOS7.6.1810

安装虚机的ISO是 CentOS-7-x86_64-Minimal-1810.iso

IP分别是172.17.134.134172.17.139.162172.17.140.87

使用172.17.134.134作为主节点master,其他两台作为子节点worker

image-20231016104220798

部署步骤

以下都是使用root账号操作

设置hostname

为所有的虚机设置不同的hostname

在172.17.134.134上执行以下命令

hostnamectl set-hostname k8s-node-134

在172.17.139.162上执行以下命令

hostnamectl set-hostname k8s-node-162

在172.17.140.87上执行以下命令

hostnamectl set-hostname k8s-node-87

修改hosts文件

修改所有虚机的/etc/hosts文件,保证可以使用主机名访问虚机

在所有的虚机上执行以下命令

# 在所有的虚机上执行以下命令
cat >> /etc/hosts << EOF
172.17.134.134 k8s-node-134
172.17.139.162 k8s-node-162
172.17.140.87 k8s-node-87
EOF

关闭防火墙

在所有的虚机上执行以下命令

systemctl stop firewalld && systemctl disable firewalld && systemctl status firewalld

时间同步

在所有的虚机上执行以下命令

yum install chrony -y
systemctl start chronyd && systemctl enable chronyd && systemctl status chronyd
chronyc sources

禁用swap分区

在所有的虚机上执行以下命令

swapoff -a && sed -ri 's/.*swap.*/#&/' /etc/fstab

关闭selinux

在所有的虚机上执行以下命令

sed -i 's/enforcing/disabled/' /etc/selinux/config && setenforce 0

加载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

image-20231017142922693

安装docker

在所有的虚机上执行以下命令

tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["http://hub-mirror.c.163.com"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

PS:如果之前有安装过docker,则会报错docker-ce conflicts with 2:docker-1.13.1-209.git7d71120.el7.centos.x86_64,可以参考该链接解决

启动docker

在所有的虚机上执行以下命令

systemctl start docker && systemctl enable docker && systemctl status docker

安装 kubeadm、kubelet、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

查看支持的kubeadm版本

#在所有的虚机上执行以下命令
yum list kubeadm --showduplicates | sort -r

查看支持的kubectl版本

#在所有的虚机上执行以下命令
yum list kubectl --showduplicates | sort -r

查看支持的kubelet版本

#在所有的虚机上执行以下命令
yum list kubelet --showduplicates | sort -r

这里打算装1.22.0版本,先查看一下有没有该版本

#在所有的虚机上执行以下命令
yum list kubeadm --showduplicates | sort -r | grep 1.22
yum list kubectl --showduplicates | sort -r | grep 1.22
yum list kubelet --showduplicates | sort -r | grep 1.22

image-20231017145606788

下载1.22.0版本

#在所有的虚机上执行以下命令
yum install -y kubectl-1.22.0-0 kubelet-1.22.0-0 kubeadm-1.22.0-0

启动kubelet服务

#在所有的虚机上执行以下命令
systemctl start kubelet && systemctl enable kubelet && systemctl status kubelet

这里启动必然是失败的,不过不用担心,继续往下就行

手动观测kubelet的服务是这样子的:

  • 启动后,刚看到是启动成功的

  • 过了一会,systemctl status kubelet看到启动是失败的

  • journalctl -u kubelet.service查看失败的原因,原因是没有文件

image-20231017150235447

不用担心kubelet服务状态,继续往下执行就行

初始化master节点

选择172.17.134.134作为master节点

在172.17.134.134上执行以下命令

kubeadm init \
  --pod-network-cidr=10.144.0.0/16 \
  --image-repository registry.aliyuncs.com/google_containers

image-20231017150958512

运行成功后,会输出启动集群和加入集群的命令,如上图

启动集群

在172.17.134.134即master节点上执行以下命令

命令来自于上一步骤kubeadm init的输出

# 在master节点上执行以下命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

启动集群后,再次查看kubelet的服务状态,可以看到已经是运行中

systemctl status kubelet.service

image-20231017151309348

初始化worker节点

初始化worker

选择172.17.139.162和172.17.140.87作为worker节点

在172.17.139.162和172.17.140.87上(即worker节点)执行以下命令

命令来自于上一步骤kubeadm init的输出

#在 worker节点上执行以下命令
kubeadm join 172.17.134.134:6443 --token u0i37n.pxvjhh7qvk4czcf9 \
        --discovery-token-ca-cert-hash sha256:c7115e5ac365e000c63d65fa149ff30817f14ec784e66f907725763d38f630b3

image-20231017151931702

验证是否加入成功

在172.17.134.134即master节点上执行以下命令

kubectl get node -o wide

image-20231017152044873

可以看到加入成功了,只是状态还是NotReady

安装网络插件

这里选择安装Calico插件

下载calico.yaml文件

在172.17.134.134即master节点上执行以下命令

#在master节点上执行以下命令
curl -o ./calico.yaml  https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml

修改calico.yaml文件

找到原文件中内容如下的部分

# - name: CALICO_IPV4POOL_CIDR
#   value: "192.168.0.0/16"

image-20231017153445818

修改为《初始化master节点》中kubeadm init --pod-network-cidr=10.144.0.0/16... 命令中的10.144.0.0/16

- name: CALICO_IPV4POOL_CIDR
  value: "10.144.0.0/16"

image-20231017153801192

应用calico

在172.17.134.134即master节点上执行以下命令

kubectl apply -f calico.yml

查看calico

在172.17.134.134即master节点上执行以下命令

kubectl get po -A -o wide | grep calico

image-20231017155627562

查看nodes

在172.17.134.134即master节点上执行以下命令

kubectl get nodes -o wide

image-20231017155712080

可以看到nodes均处于ready状态了

查看组件状态

在172.17.134.134即master节点上执行以下命令

 kubectl get cs

image-20231017160152719

矫正scheduler组件

上图可以看到scheduler组件是unhealthy状态

修改/etc/kubernetes/manifests/kube-scheduler.yaml文件,删除- --port=0

image-20231017160824895

删除后

image-20231017160947702

然后重启kubelet服务

systemctl restart kubelet.service && systemctl status kubelet.service

再次查看cs

#在172.17.134.134即master节点上执行以下命令
kubectl get cs

image-20231017161205226

至此,完成部署与安装

kubectl命令自动补全

运行以下命令,可以tab自动补全kubectl命令

yum -y install bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc

验证

创建一个pod来验证一下

创建文件pod.yml

apiVersion: v1
kind: Pod
metadata:
  name: pod-pi
spec:
  containers:
    - name: pi
      image: perl:5.34.0
      command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      imagePullPolicy: IfNotPresent
      

apply yaml文件

kubectl apply -f pod.yml

查看pod和获取日志

kubectl get pod
kubectl logs pod-pi

image-20231017162654034

链接

【原创】kubectl get cs显示unhealthy的解决办法 - wuliping - 博客园 (cnblogs.com)

1分钟配置Kubectl命令自动补全功能-腾讯云开发者社区-腾讯云 (tencent.com)