k8s的官网地址:https://kubernetes.io/docs
Kubernetes 也称为 K8s,是一个开源系统,用于自动化容器化应用程序的部署、扩展和管理。
K8s通过各种资源对象来管理pod相关的功能,借助pod本身的功能实现大规模容器应用的自动化管理,实际上K8s就是一个大规模的容器应用管理平台
1.搭建k8s集群
本文使用kubeadm的方式来安装k8s
安装 kubeadm |Kubernetes的kubeadm安装的官方文档:安装 kubeadm |Kubernetes的
1.1k8s节点规划
主机名 | ip |
master | 192.168.226.140 |
node1 | 192.168.226.141 |
node2 | 192.168.226.142 |
1.2基础环境配置
1.检查操作系统的版本
# 此方式下安装kubernetes集群要求Centos版本要在7.5或之上
[root@master ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
2.配置阿里云yum源
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
3.配置三台主机的静态ip
分别编辑三台主机的/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
此时三台主机的网络都正常可用了
4.修改主机名配置hosts映射
修改主机名
# 四台服务器分别进入/etc/hostname文件中,分别修改主机名为master、node1、node2、node3
# 查看当前主机名
hostname
配置hosts映射
# 配置hosts文件,添加主机名和ip地址映射
vim /etc/hosts
# 修改完第一台机器的ip映射后,然后分发到各个不同的机器上 xxx代表目标服务器的主机名
scp /etc/hosts root@xxx:/etc/
5.替换systemctl(如果systemctl不能用)
下面使用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
6.禁用firewalld服务
#在k8s集群每台机器分别执行
# 1 关闭firewalld服务
[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld
#查看防火墙是否开启
firewall-cmd --state
7.禁用selinux
#在k8s集群每台机器分别执行
# 编辑 /etc/selinux/config 文件,修改SELINUX的值为disable
# 注意修改完毕之后需要重启linux服务
SELINUX=disabled
# 查看状态
sestatus
8.关闭swap
#k8s每台机器分别执行
# 编辑分区配置文件/etc/fstab,注释掉swap分区一行
# 注意修改完毕之后需要重启linux服务
vim /etc/fstab
注释掉 /dev/mapper/centos-swap swap
# /dev/mapper/centos-swap swap
9. 设置ipv4和v6的流量链接
cat << EOF >> /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 生效
sysctl --system
10.同步时间
yum -y install ntpdate
ntpdate time.Windows.com
基础配置完成重启机器
1.3安装基础软件
1.安装docker(所有节点)
# 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
2.安装Kubernetes组件(所有节点)
# 更换镜像源
# 编辑/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
1.4.集群初始化
下面操作只需要在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
1.5.安装网络插件,只在master节点操作即可
从初始化信息提示可以去官网查看配置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博客