kubeadm 部署 k8s
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.134、172.17.139.162、172.17.140.87
使用172.17.134.134作为主节点master,其他两台作为子节点worker

部署步骤
以下都是使用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

安装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

下载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查看失败的原因,原因是没有文件 

不用担心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

运行成功后,会输出启动集群和加入集群的命令,如上图
启动集群
在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

初始化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

验证是否加入成功
在172.17.134.134即master节点上执行以下命令
kubectl get node -o wide

可以看到加入成功了,只是状态还是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"

修改为《初始化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"

应用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

查看nodes
在172.17.134.134即master节点上执行以下命令
kubectl get nodes -o wide

可以看到nodes均处于ready状态了
查看组件状态
在172.17.134.134即master节点上执行以下命令
 kubectl get cs

矫正scheduler组件
上图可以看到scheduler组件是unhealthy状态
修改/etc/kubernetes/manifests/kube-scheduler.yaml文件,删除- --port=0

删除后

然后重启kubelet服务
systemctl restart kubelet.service && systemctl status kubelet.service
再次查看cs
#在172.17.134.134即master节点上执行以下命令
kubectl get cs

至此,完成部署与安装
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

链接
【原创】kubectl get cs显示unhealthy的解决办法 - wuliping - 博客园 (cnblogs.com)
                    
                
                
            
        
浙公网安备 33010602011771号