本文章主要介绍测试环境的kubenetes集群部署
准备三台虚拟机,2核2G即可,资源不够也可1核2G
操作系统:centos 7.9
主机ip:192.168.1.21(master节点)、192.168.1.22(node节点)、192.168.1.23(node节点)
为主机固定ip,可详见本人博客:vmware中使用桥接使虚拟机使用宿主机WiFi
# 关闭防火墙
~]# systemctl stop firewalld
~]# systemctl disable firewalld
# 关闭selinux
~]# setenforce 0
~]# sed -i 's/enforcing/disabled/' /etc/selinux/config
# 关闭swap
~]# swapoff -a
~]# sed -ri 's/.*swap.*/#&/' /etc/fstab
这里以master主机为例,主机名可自定义,主要用于区分master主机与node主机
~]# hostnamectl set-hostname k8s-master1
~]# hostname k8s-master1
~]# cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
~]# sysctl --system
~]# yum -y install ntpdate
~]# ntpdate time.windows.com
~]# yum -y install yum-utils
~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
~]# yum repolist # 查看yum是否加载成功
~]# yum -y install docker-ce # 安装docker
配置docker镜像仓库为阿里云,并指定cgourp
~]# vim /etc/docker/daemon.json # docker目录默认不存在,需要创建
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
~]# systemctl start docker # 启动docker
~]# systemctl enable docker # 配置开机自启
~]# docker info # 查看docker信息
配置kubernetes的yum镜像源为阿里云
~]# vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
~]# yum makecache # 清理yum缓存
~]# yum repolist # 检查kubernetes源是否启用
执行安装命令
~]# yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0
~]# systemctl enable kubelet
▲ ▲
Ⅰ Ⅰ
Ⅰ Ⅰ
Ⅰ Ⅰ
【以上步骤在所有主机上执行】
【初始化集群只需要在master节点上执行即可】
kubeadm init \
--apiserver-advertise-address=192.168.1.21 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all
命令中参数说明
–apiserver-advertise-address 集群通告地址
–image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
–kubernetes-version K8s版本,与上面安装的一致
–service-cidr 集群内部虚拟网络,Pod统一访问入口
–pod-network-cidr Pod网络,与下面部署的CNI网络组件yaml中保持一致
–ignore-preflight-errors 跳过报错
初始化完成后,最后会输出一个join命令,先记住,下面用。
初始化生成的join命令有效期只有24小时,如果24小时候后需要加新的node或者忘记了join命令,需要再次生成,命令入下
~]# kubeadm token create --print-join-command
kubeadm join 192.168.1.21:6443 --token 3efg2c.lbck9kqgxjow77bx --discovery-token-ca-cert-hash sha256:ecd6cfafa72a86303ce8e724de135bb5a688e06ecad2c55be893b2ee5c7ba7f6
~]# mkdir -p $HOME/.kube
~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
~]# chown $(id -u):$(id -g) $HOME/.kube/config
查看kubernetes节点,此时只能看到一个节点
~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master1 NotReady control-plane,master 8h v1.23.0
复制初始化后的join字符串到node节点上执行
这里以node1为例,注意:此处不要用我的命令,需要使用你master主机上初始化成功后的,在初始化成功后会看到这条命令,直接复制就好了。如果忘记可在master主机上再次生成
~]# kubeadm join 192.168.1.21:6443 --token 3efg2c.lbck9kqgxjow77bx --discovery-token-ca-cert-hash sha256:ecd6cfafa72a86303ce8e724de135bb5a688e06ecad2c55be893b2ee5c7ba7f6
安装好node节点,即可在master节点上查看,此时看到的节点状态都是NotReady,这是因为没有安装网路插件,安装好网络插件就好了。
~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master1 NotReady control-plane,master 8h v1.23.0
k8s-node01 NotReady <none> 8h v1.23.0
k8s-node02 NOtReady <none> 8h v1.23.0
该步骤在master节点上执行
使用wget命令获取插件的yaml文件,如果下载失败,我将我的calico.yaml文件上传到了资源,可通过本连接下载:calico.yaml
wget https://docs.projectcalico.org/manifests/calico.yaml
修改yaml文件,需要修改里面定义Pod网络(CALICO_IPV4POOL_CIDR),与前面kubeadm init的 --pod-network-cidr指定的一样,如下图
修改完配置后,即可进行部署
~]# kubectl apply -f calico.yaml
~]# kubectl get pods -n kube-system
如果看到的是以下的内容,就说明部署成功,部署后需要等待几分钟。
~]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-5c64b68895-xlg4q 1/1 Running 0 76m
calico-node-8hks2 1/1 Running 0 76m
calico-node-nv7kg 1/1 Running 0 76m
calico-node-v9mcl 1/1 Running 0 76m
coredns-6d8c4cb4d-8pd2l 1/1 Running 0 8h
coredns-6d8c4cb4d-kg6h2 1/1 Running 0 8h
etcd-k8s-master1 1/1 Running 10 (109m ago) 8h
kube-apiserver-k8s-master1 1/1 Running 8 8h
kube-controller-manager-k8s-master1 1/1 Running 7 (109m ago) 8h
kube-proxy-946p5 1/1 Running 0 8h
kube-proxy-fdm9s 1/1 Running 0 8h
kube-proxy-wrccj 1/1 Running 1 8h
kube-scheduler-k8s-master1 1/1 Running 8 (109m ago) 8h
该步骤在master节点上执行
也是一样需要使用wget命令下载对应的yaml文件
~]# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml
下载失败可以使用我上传的资源,资源链接:kubernets-dashboard.yaml
Dashboard是官方提供的一个UI,可用于基本管理K8s资源。默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部。
~]# kubectl apply -f kubernetes-dashboard.yaml
~]# kubectl get pods -n kubernetes-dashboard
NAME READY STATUS RESTARTS AGE
dashboard-metrics-scraper-799d786dbf-dkkzd 1/1 Running 0 84m
kubernetes-dashboard-6b6b86c4c5-6c58q 1/1 Running 0 84m
bashboard部署好后,可直接通过浏览器进行访问,可以访问k8s集群任意主机ip的30001端口,30001端口在yaml文件中定义了。访问后,会看到以下界面
这里需要使用token进行访问,可以通过以下命令来创建token
# 创建用户
~]# kubectl create serviceaccount dashboard-admin -n kube-system
# 用户授权
~]# kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
# 获取用户Token
~]# kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
复制token登录,注意:在复制时不要将前后的空格也复制进去
到此时,我们的kubernetes集群算是安装部署完成了,此时我们可以尝试在dashboard中部署一个nginx
选择镜像、pod名、pod数量、端口信息,然后点击部署
等待几分钟后,在终端使用命令可查看pod节点
~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web-969b69cd7-44wbm 1/1 Running 0 85m
web-969b69cd7-fn4kn 1/1 Running 0 84m
web-969b69cd7-t248l 1/1 Running 0 84m
也可在前端查看pod节点
在终端通过命令查看nginx的pod映射的端口
~]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 8h
web LoadBalancer 10.5.82.77 <pending> 80:30608/TCP 86m
通过命令可以看到,映射的端口为30608,此时在浏览器访问集群内任意机器的30608端口即可访问到nginx
只需要将master节点上的.kube/下的配置文件拷贝到node节点下的.kube/目录下即可
[root@k8s-node01 ~]# mkdir .kube # 在node节点上创建.kube目录,是用户家目录下创建
[root@k8s-master1 ~]# scp .kube/* [email protected]:/root/.kube/ # 在master主机上将配置文件拷贝到node节点上
[root@k8s-node01 ~]# kubectl get nodes # 在node节点上使用kubectl命令
NAME STATUS ROLES AGE VERSION
k8s-master1 Ready control-plane,master 14h v1.23.0
k8s-node01 Ready <none> 14h v1.23.0
k8s-node02 Ready <none> 14h v1.23.0
原因:执行初始化命令时,本机ip为192.168.1.21在命令中写成了0.21,导致初始化失败,日志中提示一下内容。执行失败后,可根据提示执行命令查看相关日志
解决方案:由于我ip填写错误,导致我后面修改回正确的ip后还是回去连接0.21,这是时候需要执行清楚配置命令,该命令危险性较大,建议谨慎执行。
~]# kubectl reset
清楚配置后再重新进行初始化即可
原因:该问题可能是网络问题导致的,这是再pull镜像时失败,可尝试手动pull一下镜像。我这里是只有一个镜像pod节点没起来,所有我可以到其他的running的节点上去看镜像版本。经过检查我的是master节点上没有calico/cni、calico/node、calico/kube-controllers 这三个镜像。
解决方案:
1、在缺少镜像的节点上,手动pull指定版本的插件,pull时版本需要与其他节点上的一致
2、在有镜像的节点上,将镜像导成tar包,然后传到缺少镜像的节点上,然后load上镜像
手动pull镜像时,可以用grep命令看一下calico依赖的镜像。这里我们可以看到,calico需要三个镜像,分别为:calico/cni:v3.23.3、calico/node:v3.23.3、calico/kube-controllers:v3.23.3。在pull时一定要注意版本。
~]# grep image calico.yaml
image: docker.io/calico/cni:v3.23.3
image: docker.io/calico/cni:v3.23.3
image: docker.io/calico/node:v3.23.3
image: docker.io/calico/node:v3.23.3
image: docker.io/calico/kube-controllers:v3.23.3
我这里使用的是第二种方案
检查节点镜像
~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
calico/kube-controllers v3.23.3 32d39d8db456 3 days ago 127MB
calico/cni v3.23.3 ecf96bae0aa7 3 days ago 254MB
calico/node v3.23.3 5f5175f39b19 3 days ago 203MB
registry.aliyuncs.com/google_containers/kube-proxy v1.23.0 e03484a90585 7 months ago 112MB
registry.aliyuncs.com/google_containers/coredns v1.8.6 a4ca41631cc7 9 months ago 46.8MB
registry.aliyuncs.com/google_containers/pause 3.6 6270bb605e12 11 months ago 683kB
save镜像为tar包
~]# docker save -o calico_kube-controllers.tar.gz calico/kube-controllers:v3.23.3
~]# docker save -o calico_cni.tar.gz calico/cni:v3.23.3
~]# docker save -o calico_node.tar.gz calico/node:v3.23.3
由于我是master节点缺少镜像,这里就scp镜像包到master节点上
~]# scp *.tar.gz [email protected]:/root/
在master节点上将镜像包load成镜像
~]# docker load -i calico_cni.tar.gz
~]# docker load -i calico_kube-controllers.tar.gz
~]# docker load -i calico_node.tar.gz
加载完镜像后重启kubectl进程,让程序自动加载生成pod,等待几分钟就好了。
~]# systemctl restart kubectl
查看pod时加上 -o wide可以看到pod是运行在那个节点上
~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web-969b69cd7-44wbm 1/1 Running 0 114m 10.244.58.196 k8s-node02 <none> <none>
web-969b69cd7-fn4kn 1/1 Running 0 114m 10.244.85.196 k8s-node01 <none> <none>
web-969b69cd7-t248l 1/1 Running 0 114m 10.244.58.195 k8s-node02 <none> <none>
查看kubectl的日志
journalctl -f -u kubelet
查看容器日志,在pod部署失败时,查看pod日志使用
docker logs 容器id
查看某个pod日志
~]# kubectl logs pod名