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)