k8s的官网地址:https://kubernetes.io/docs
Kubernetes 也称为 K8s,是一个开源系统,用于自动化容器化应用程序的部署、扩展和管理。
K8s通过各种资源对象来管理pod相关的功能,借助pod本身的功能实现大规模容器应用的自动化管理,实际上K8s就是一个大规模的容器应用管理平台
本文使用kubeadm的方式来安装k8s
安装 kubeadm |Kubernetes的kubeadm安装的官方文档:安装 kubeadm |Kubernetes的
| 主机名 | ip |
| master | 192.168.226.140 |
| node1 | 192.168.226.141 |
| node2 | 192.168.226.142 |
- # 此方式下安装kubernetes集群要求Centos版本要在7.5或之上
- [root@master ~]# cat /etc/redhat-release
- CentOS Linux release 7.9.2009 (Core)
centos7.9的yum源不可用,更换一下
- #下载repo文件
- wget http://mirrors.aliyun.com/repo/Centos-7.repo
-
- # 备份并替换系统的repo文件
- cp Centos-7.repo /etc/yum.repos.d/
- cd /etc/yum.repos.d/
- mv CentOS-Base.repo CentOS-Base.repo.bak
- mv Centos-7.repo CentOS-Base.repo
-
- # 执行yum源更新命令
- yum clean all
- yum makecache
- yum update -y
分别编辑三台主机的/etc/sysconfig/network-scripts/ifcfg-ens33文件
1)文件内容要根据vmware的配置更改,具体如下:

选择虚拟网络编辑器

选择VMnet8的NAT设置

可以看到ip地址是192.168.226.0这个网段的,所以下面配置静态ip也要在这个网段才能上网
2)接下来分别编辑master,node1,node2的/etc/sysconfig/network-scripts/ifcfg-ens33文件

可以看到默认配置是dhcp,这样的话每次重启虚拟机ip地址会更改,如果IP更改下面在配置ip地址映射的话会很不方便,所以要配置静态ip
master主机配置
- [root@master ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens3
- TYPE=Ethernet
- PROXY_METHOD=none
- BROWSER_ONLY=no
- BOOTPROTO=static
- DEFROUTE=yes
- IPV4_FAILURE_FATAL=no
- IPV6INIT=yes
- IPV6_AUTOCONF=yes
- IPV6_DEFROUTE=yes
- IPV6_FAILURE_FATAL=no
- IPV6_ADDR_GEN_MODE=stable-privacy
- NAME=ens33
- UUID=5d60f1f8-5796-49c3-bd6d-6fcb36badf81
- DEVICE=ens33
- ONBOOT=yes
- IPADDR=192.168.226.140
- GATEWAY=192.168.226.2
- NETMASK=255.255.255.0
- PEERD=no
node1主机配置
- [root@node1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
- TYPE=Ethernet
- PROXY_METHOD=none
- BROWSER_ONLY=no
- BOOTPROTO=static
- DEFROUTE=yes
- IPV4_FAILURE_FATAL=no
- IPV6INIT=yes
- IPV6_AUTOCONF=yes
- IPV6_DEFROUTE=yes
- IPV6_FAILURE_FATAL=no
- IPV6_ADDR_GEN_MODE=stable-privacy
- NAME=ens33
- UUID=87c335e1-d0fc-4805-8b23-7ccd66ca2821
- DEVICE=ens33
- ONBOOT=yes
- IPADDR=192.168.226.141
- GATEWAY=192.168.226.2
- NETMASK=255.255.255.0
- PEERD=no
node2主机配置
- [root@node2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
- TYPE=Ethernet
- PROXY_METHOD=none
- BROWSER_ONLY=no
- BOOTPROTO=static
- DEFROUTE=yes
- IPV4_FAILURE_FATAL=no
- IPV6INIT=yes
- IPV6_AUTOCONF=yes
- IPV6_DEFROUTE=yes
- IPV6_FAILURE_FATAL=no
- IPV6_ADDR_GEN_MODE=stable-privacy
- NAME=ens33
- UUID=70acb8ac-608a-443b-a59d-5b936bf6160f
- DEVICE=ens33
- ONBOOT=yes
- IPADDR=192.168.226.142
- GATEWAY=192.168.226.2
- NETMASK=255.255.255.0
- PEERD=no
然后重启机器让ip配置生效,可以通过ip addr查看是否生效
之后通过ping www.baidu.com检查网络是否正常,此时三台机器网络都不可用
3)修改三台主机的/etc/resolv.conf文件,配置DNS服务器
- # Generated by NetworkManager
- # 三台主机在resolv.conf文件都增加下面这一行
- nameserver 114.114.114.114
此时三台主机的网络都正常可用了

修改主机名
# 四台服务器分别进入/etc/hostname文件中,分别修改主机名为master、node1、node2、node3
# 查看当前主机名
hostname
配置hosts映射
# 配置hosts文件,添加主机名和ip地址映射
vim /etc/hosts
# 修改完第一台机器的ip映射后,然后分发到各个不同的机器上 xxx代表目标服务器的主机名
scp /etc/hosts root@xxx:/etc/

下面使用systemctl的时候会出现如下情况,就需要进行替换,否则不用

#在k8s集群每台机器分别执行
#1.备份原来的systemctl文件
mv /usr/bin/systemctl /usr/bin/systemctl.old
#2.重新生成文件
#打开https://raw.githubusercontent.com/gdraheim/docker-systemctl-replacement/master/files/docker/systemctl.py这个网站,将页面的所有内容都复制,然后在使用VIM命令打开systemctl文件,并将刚才复制的东西粘贴进去并保存
vim /usr/bin/systemctl
chmod +x /usr/bin/systemctl
- #在k8s集群每台机器分别执行
- # 1 关闭firewalld服务
- [root@master ~]# systemctl stop firewalld
- [root@master ~]# systemctl disable firewalld
-
- #查看防火墙是否开启
- firewall-cmd --state
- #在k8s集群每台机器分别执行
- # 编辑 /etc/selinux/config 文件,修改SELINUX的值为disable
- # 注意修改完毕之后需要重启linux服务
- SELINUX=disabled
-
- # 查看状态
- sestatus

- #k8s每台机器分别执行
- # 编辑分区配置文件/etc/fstab,注释掉swap分区一行
- # 注意修改完毕之后需要重启linux服务
- vim /etc/fstab
- 注释掉 /dev/mapper/centos-swap swap
- # /dev/mapper/centos-swap swap
- cat << EOF >> /etc/sysctl.d/k8s.conf
- 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
基础配置完成重启机器
- # 1、切换镜像源
- [root@master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
-
- # 2、查看当前镜像源中支持的docker版本
- [root@master ~]# yum list docker-ce --showduplicates
-
- # 3、安装特定版本的docker-ce
- # 必须制定--setopt=obsoletes=0,否则yum会自动安装更高版本
- [root@master ~]# yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y
-
- # 4、添加一个配置文件
- #Docker 在默认情况下使用Vgroup Driver为cgroupfs,而Kubernetes推荐使用systemd来替代cgroupfs
- [root@master ~]# mkdir /etc/docker
- [root@master ~]# cat <<EOF> /etc/docker/daemon.json
- {
- "exec-opts": ["native.cgroupdriver=systemd"],
- }
- EOF
-
- # 5、启动dokcer
- [root@master ~]# systemctl restart docker
- [root@master ~]# systemctl enable docker
-
- # 6.测试
- docker run hello-world
此时无法拉取镜像,会出现如下错误
- [root@master ~]# docker run hello-world
- Unable to find image 'hello-world:latest' locally
- latest: Pulling from library/hello-world
- c1ec31eb5944: Pulling fs layer
- docker: error pulling image configuration: Get https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/d2/d2c94e258dcb3c5ac2798d32e1249e42ef01cba4841c2234249495f87264ac5a/data?verify=1723092638-fv94jBucnZv8F3RxbCAM5l5MA%2Fk%3D: dial tcp 108.160.163.106:443: connect: connection refused.
- See 'docker run --help'.

要更换镜像源,在/etc/docker/daemon.json中添加如下配置
- {
- "registry-mirrors": [
- "https://do.nark.eu.org",
- "https://dc.j8.work",
- "https://docker.m.daocloud.io",
- "https://dockerproxy.com",
- "https://docker.mirrors.ustc.edu.cn",
- "https://docker.nju.edu.cn"
- ]
- }
然后systemctl restart docker重启后重新拉取测试
- [root@master ~]# systemctl restart docker
- Job for docker.service failed because start of the service was attempted too often. See "systemctl status docker.service" and "journalctl -xe" for details.
- To force a start use "systemctl reset-failed docker.service" followed by "systemctl start docker.service" again.
出现这种情况可能是daemon.json里面有空格或者格式不对,然后修改为下面这样
- {
- "exec-opts": ["native.cgroupdriver=systemd"],
- "registry-mirrors": [ "https://do.nark.eu.org","https://dc.j8.work","https://docker.m.daocloud.io","https://dockerproxy.com","https://docker.mirrors.ustc.edu.cn","https://docker.nju.edu.cn"]
- }
systemctl restart docker重启后重新拉取测试

此时docker安装完成
docker安装出现问题汇总
1) Failed to get D-Bus connection: Operation not permitted
更换systemctl
2)docker无法启动,一直启动失败

查看日志文件 /var/log/journal/docker.service.log会有如下报错
can't initialize iptables table `nat': Permission denied (you must be root)
此时可以修改/usr/lib/systemd/system/docker.service文件,对ExecStart=/usr/bin/dockerd 添加--iptables=false,也就是ExecStart=/usr/bin/dockerd --iptables=false
3)文件系统需要由overlay2更换为vfs
编辑/etc/docker/daemon.json。如果它还不存在,请创建后再编辑它。添加以下内容
- {
- "storage-driver": "vfs"
- }
4)controller: error obtaining controller instance: Enabling IP forwarding failed: open /proc/sys/net/ ipv4/ip_forward: read-only file
修改/proc/sys/net/ipv4/ip_forward内容为1,echo "1" > /proc/sys/net/ipv4/ip_forward
- # 更换镜像源
- # 编辑/etc/yum.repos.d/kubernetes.repo,添加下面的配置
- cat > /etc/yum.repos.d/kubernetes.repo << EOF
- [kubernetes]
- name=Kubernetes Repo
- baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
- gpgcheck=0
- enabled=1
- repo_gpgcheck=0
- gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpgp
- http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
- EOF
-
-
- # 查询kubeadm可用的版本
- yum list kubeadm --showduplicates
-
- # 安装kubeadm、kubelet、kubect
- yum install -y kubeadm-1.18.0 kubelet-1.18.0 kubectl-1.18.0
-
-
- # 设置kubelet开机自启
- systemctl enable kubelet
下面操作只需要在master节点执行
- # 创建集群
- # apiserver-advertise-address的ip地址是你master节点的ip地址
- [root@master ~]# kubeadm init --apiserver-advertise-address=192.168.226.140 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16
根据下面的提示分别在master和node上执行不同的操作

在master节点执行
- [root@master ~]# mkdir -p $HOME/.kube
- [root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
- [root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
在node节点执行
- kubeadm join 192.168.226.128:6443 --token q64ha5.cuo0wdzca8sztzg9 \
- --discovery-token-ca-cert-hash sha256:d6b29a698a28cf1939ede7e4f7605635e05361a05bbea928e947147b512423a5
在master节点上查看节点信息
- [root@master ~]# kubectl get nodes
- NAME STATUS ROLES AGE VERSION
- master NotReady master 18m v1.17.4
- node1 NotReady <none> 4m2s v1.17.4
- node2 NotReady <none> 3m57s v1.17.4
从初始化信息提示可以去官网查看配置cni网络Installing Addons | Kubernetes

进入官网可以看到有很多的解决方案,这里选择安装flannel
- [root@master ~]# mkdir /opt/k8s -p
- [root@master ~]# cd /opt/k8s/
- [root@master k8s]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
修改kube-flannel.yml文件
- # 删除镜像docker.io的前缀
- sed -i 's#docker.io/##g' calico.yaml

然后手动拉取镜像文件
- [root@master k8s]# grep image: kube-flannel.yml
- image: flannel/flannel-cni-plugin:v1.5.1-flannel1
- image: flannel/flannel:v0.25.5
- image: flannel/flannel:v0.25.5
- [root@master k8s]# docker pull flannel/flannel-cni-plugin:v1.5.1-flannel1
- v1.5.1-flannel1: Pulling from flannel/flannel-cni-plugin
- 3fb2a2b49db6: Pull complete
- bd4df3c464ff: Pull complete
- Digest: sha256:442c2f8e1f9d27145b4090d0e8819b72676d46ac95cc81e944a7b69f49db5151
- Status: Downloaded newer image for flannel/flannel-cni-plugin:v1.5.1-flannel1
- [root@master k8s]# docker pull flannel/flannel:v0.25.5
- v0.25.5: Pulling from flannel/flannel
- 3fb2a2b49db6: Already exists
- 6b518edcd22b: Pull complete
- b1e57e1b0d6e: Pull complete
- b678a87bf163: Pull complete
- de2b3914d857: Pull complete
- d804e8345c6b: Pull complete
- 535c74dae788: Pull complete
- 37965b9184b4: Pull complete
- 4f4fb700ef54: Pull complete
- b7757664f176: Pull complete
- Digest: sha256:4f65cc179d15e8ee4d67a6a32ce89c02094120a46452a4e0341d26be9fd556c3
- Status: Downloaded newer image for flannel/flannel:v0.25.5
最后配置网络
- [root@master k8s]# kubectl apply -f kube-flannel.yml
- namespace/kube-flannel created
- clusterrole.rbac.authorization.k8s.io/flannel created
- clusterrolebinding.rbac.authorization.k8s.io/flannel created
- serviceaccount/flannel created
- configmap/kube-flannel-cfg created
- daemonset.apps/kube-flannel-ds created
- [root@master k8s]#
等一会然后通过下面查看pod和节点状态
- [root@master k8s]# kubectl get po -n kube-system
- NAME READY STATUS RESTARTS AGE
- coredns-7ff77c879f-6cwq8 1/1 Running 0 13m
- coredns-7ff77c879f-fvhqn 1/1 Running 0 13m
- etcd-master 1/1 Running 0 14m
- kube-apiserver-master 1/1 Running 0 14m
- kube-controller-manager-master 1/1 Running 0 14m
- kube-proxy-8dxzv 1/1 Running 0 13m
- kube-proxy-8sbbh 1/1 Running 0 13m
- kube-proxy-tcvzp 1/1 Running 0 13m
- kube-scheduler-master 1/1 Running 0 14m
- [root@master k8s]# kubectl get no
- NAME STATUS ROLES AGE VERSION
- master Ready master 15m v1.18.0
- node1 Ready <none> 14m v1.18.0
- node2 Ready <none> 14m v1.18.0
可以看到pod都是running状态并且节点都是ready状态,此时k8s集群配置完成。
本文参考:
Kubernetes - CentOS7搭建k8s_v1.18集群高可用(kubeadm/二进制包部署方式)实测配置验证手册_kubernetes部署验证-CSDN博客