k8s的安装-单master、多node
- 平台安装
-
- 环境准备
-
- 关闭firewalld、selinux、swap
- 设置主机名
- 桥接IPV4到iptables链上
- 配置时钟同步
- 安装docker
-
- 配置docker的yum镜像源为阿里云
- 配置docker镜像仓库
- 安装kubenetes
-
- 执行安装kubernetes
- 初始化kubernetes集群
- 拷贝kubectl需要的证书到默认路径下
- 安装node节点
- 部署calico网络插件
- 部署dashboard
-
- 修改配置yaml文件
- 部署
- 访问dashboard
- dashboard中部署nginx的
- 在node节点上配置kubectl命令
- 安装中遇到故障的排查
-
- 初始化失败
- calio插件部署失败,提示:Init: ImagePullBackOff
- 排查问题种需要使用的命令
平台安装 环境准备 本文章主要介绍测试环境的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
关闭firewalld、selinux、swap
# 关闭防火墙
~]# 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
桥接IPV4到iptables链上
~]# 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
安装docker 配置docker的yum镜像源为阿里云
~]# 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镜像仓库
配置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信息
安装kubenetes 配置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源是否启用
执行安装kubernetes
执行安装命令
~]# yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0
~]# systemctl enable kubelet
▲ ▲
Ⅰ Ⅰ
Ⅰ Ⅰ
Ⅰ Ⅰ
【以上步骤在所有主机上执行】
初始化kubernetes集群
【初始化集群只需要在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
拷贝kubectl需要的证书到默认路径下
~]# 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
NAMESTATUSROLESAGEVERSION
k8s-master1NotReadycontrol-plane,master8hv1.23.0
安装node节点
复制初始化后的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
NAMESTATUSROLESAGEVERSION
k8s-master1NotReadycontrol-plane,master8hv1.23.0
k8s-node01NotReady8hv1.23.0
k8s-node02NOtReady8hv1.23.0
部署calico网络插件 该步骤在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
NAMEREADYSTATUSRESTARTSAGE
calico-kube-controllers-5c64b68895-xlg4q1/1Running076m
calico-node-8hks21/1Running076m
calico-node-nv7kg1/1Running076m
calico-node-v9mcl1/1Running076m
coredns-6d8c4cb4d-8pd2l1/1Running08h
coredns-6d8c4cb4d-kg6h21/1Running08h
etcd-k8s-master11/1Running10 (109m ago)8h
kube-apiserver-k8s-master11/1Running88h
kube-controller-manager-k8s-master11/1Running7 (109m ago)8h
kube-proxy-946p51/1Running08h
kube-proxy-fdm9s1/1Running08h
kube-proxy-wrccj1/1Running18h
kube-scheduler-k8s-master11/1Running8 (109m ago)8h
部署dashboard 该步骤在master节点上执行
也是一样需要使用wget命令下载对应的yaml文件
~]# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml
下载失败可以使用我上传的资源,资源链接:kubernets-dashboard.yaml
修改配置yaml文件
Dashboard是官方提供的一个UI,可用于基本管理K8s资源。默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部。
文章图片
部署
~]# kubectl apply -f kubernetes-dashboard.yaml
~]# kubectl get pods -n kubernetes-dashboard
NAMEREADYSTATUSRESTARTSAGE
dashboard-metrics-scraper-799d786dbf-dkkzd1/1Running084m
kubernetes-dashboard-6b6b86c4c5-6c58q1/1Running084m
访问dashboard
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
dashboard中部署nginx的
文章图片
选择镜像、pod名、pod数量、端口信息,然后点击部署
文章图片
等待几分钟后,在终端使用命令可查看pod节点
~]# kubectl get pods
NAMEREADYSTATUSRESTARTSAGE
web-969b69cd7-44wbm1/1Running085m
web-969b69cd7-fn4kn1/1Running084m
web-969b69cd7-t248l1/1Running084m
也可在前端查看pod节点
文章图片
在终端通过命令查看nginx的pod映射的端口
~]# kubectl get service
NAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGE
kubernetesClusterIP10.0.0.1443/TCP8h
webLoadBalancer10.5.82.7780:30608/TCP86m
通过命令可以看到,映射的端口为30608,此时在浏览器访问集群内任意机器的30608端口即可访问到nginx
文章图片
在node节点上配置kubectl命令 只需要将master节点上的.kube/下的配置文件拷贝到node节点下的.kube/目录下即可
[root@k8s-node01 ~]# mkdir .kube# 在node节点上创建.kube目录,是用户家目录下创建
[root@k8s-master1 ~]# scp .kube/* root@192.168.1.22:/root/.kube/# 在master主机上将配置文件拷贝到node节点上
[root@k8s-node01 ~]# kubectl get nodes# 在node节点上使用kubectl命令
NAMESTATUSROLESAGEVERSION
k8s-master1Readycontrol-plane,master14hv1.23.0
k8s-node01Ready14hv1.23.0
k8s-node02Ready14hv1.23.0
安装中遇到故障的排查 初始化失败 原因:执行初始化命令时,本机ip为192.168.1.21在命令中写成了0.21,导致初始化失败,日志中提示一下内容。执行失败后,可根据提示执行命令查看相关日志
文章图片
文章图片
解决方案:由于我ip填写错误,导致我后面修改回正确的ip后还是回去连接0.21,这是时候需要执行清楚配置命令,该命令危险性较大,建议谨慎执行。
~]# kubectl reset
清楚配置后再重新进行初始化即可
calio插件部署失败,提示:Init: ImagePullBackOff
文章图片
原因:该问题可能是网络问题导致的,这是再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
REPOSITORYTAGIMAGE IDCREATEDSIZE
calico/kube-controllersv3.23.332d39d8db4563 days ago127MB
calico/cniv3.23.3ecf96bae0aa73 days ago254MB
calico/nodev3.23.35f5175f39b193 days ago203MB
registry.aliyuncs.com/google_containers/kube-proxyv1.23.0e03484a905857 months ago112MB
registry.aliyuncs.com/google_containers/corednsv1.8.6a4ca41631cc79 months ago46.8MB
registry.aliyuncs.com/google_containers/pause3.66270bb605e1211 months ago683kB
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 root@192.168.1.21:/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
NAMEREADYSTATUSRESTARTSAGEIPNODENOMINATED NODEREADINESS GATES
web-969b69cd7-44wbm1/1Running0114m10.244.58.196k8s-node02
web-969b69cd7-fn4kn1/1Running0114m10.244.85.196k8s-node01
web-969b69cd7-t248l1/1Running0114m10.244.58.195k8s-node02
查看kubectl的日志
journalctl -f -u kubelet
查看容器日志,在pod部署失败时,查看pod日志使用
docker logs 容器id
【学习|k8s的安装-单master、多node】查看某个pod日志
~]# kubectl logs pod名
推荐阅读
- 学习|k8s切换引擎为containerd
- Kubernetes|Kubernetes kube-scheduler 硬核知识 控制器框架/Informer机制
- linux|Docker高级篇之可视化工具Portainer和CAdvisor+InfluxDB+Granfana
- Kubernetes|Kubernetes 聚焦Kubelet职责
- vue|探索学习 Vue 组件篇 第四篇 组件的嵌套
- docker|docker 数据卷容器,很简单的
- linux|docker 容器数据卷
- linux|linux centos7 开机自动启动执行脚本、命令 无效——解决方式
- 服务器|Linux强制重新启动系统——重启服务器的最终救济途径