在上一篇文章中已经对Kubernetes 与 yum安装Kubernetes集群 进行了介绍和讲解,也提到了Kubernetes集群的五种安装方式,由于yum安装Kubernetes的版本固定为1.5.2,不能安装最新版本,所以在生产环境中,一般很少使用yum方式来进行Kubernetes集群的安装。在生产环境中,用的最多的两种安装方式是:kubeadm安装 和 二进制安装,接下来我们就来讲解一下如何使用kubeadm方式安装Kubernetes集群。
主机名称 | 节点名称 | IP地址 | cpu (处理器数量) | 内存 | 系统及内核 |
---|---|---|---|---|---|
k8s-master | master | 192.168.198.145 | 2 | 2G | CentOS7.x,内核版本至少为3.10及以上 |
k8s-node1 | node1 | 192.168.198.146 | 2 | 2G | CentOS7.x,内核版本至少为3.10及以上 |
k8s-node2 | node2 | 192.168.198.147 | 2 | 2G | CentOS7.x,内核版本至少为3.10及以上 |
//1、查看当前主机的主机名称
hostname
//2、修改当前主机的主机名称
hostnamectl set-hostname 主机名称
这里以修改master节点的主机名为例 (node1 和 node2节点与修改master节点的主机名类似,只不过需要把k8s-master 替换为k8s-node1 和 k8s-node2即可)
//1、编辑hosts文件
vim /etc/hosts
//2、配置映射关系
192.168.198.145 k8s-master
192.168.198.146 k8s-node1
192.168.198.147 k8s-node2
这里以配置master节点的ip地址 与 主机名的映射关系为例 (node1 和 node2节点与配置master节点的ip地址 与 主机名的映射关系相同)
firewalld会影响Docker的网络功能,SELinux是2.6+版本的Linux内核中提供的强制访问控制系统,在很大程度上加强了Linux的安全性,但是它会影响Kubernetes的某些组件功能,所以我们需要在安装部署前将其禁用掉
//-----------------------------------关闭Firewalld防火墙
//1、停止firewalld服务
systemctl stop firewalld
//2、禁止firewalld开机启动
systemctl disable firewalld
//3、列出所有iptables规则
iptables -L
//-----------------------------------关闭SELinux
//1、临时关闭
setenforce 0
//2、永久关闭SELinux
sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
//3、查看SELinux状态
sestatus
由于kubernetes的想法是将实例紧密包装到尽可能接近100%,所有的部署应与CPU或者内存限制固定在一起,所以如果调度一个pod程序发送到一台机器上时,它不应该使用交换,因为这会减慢其运行速度,所以关闭swap主要是为了性能考虑
//1、临时关闭 swap分区
swapoff -a
//2、永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab
//3、查看swap分区是否已经关闭,若swap一行都显示0,则表示关闭成功
free -m
//1、安装ntpdate
yum install -y ntpdate
//2、同步系统时间,ntp1.aliyun.com为阿里的时间(NTP)服务器
ntpdate ntp1.aliyun.com
//3、创建定时任务来自动同步阿里的时间(NTP)服务器
crontab -e
//4、设置每30分钟同步一次时间
0 */30 * * * ? /usr/sbin/ntpdate ntp1.aliyun.com
//1、编写kubernetes.conf配置
vim /etc/sysctl.d/kubernetes.conf
//2、填写如下内容
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
-------------------------解释-------------------------
net.bridge.bridge-nf-call-iptables=1:开启ipv4的过滤规则
net.bridge.bridge-nf-call-ip6tables=1:开启iptables中ipv6的过滤规则
net.ipv4.ip_forward=1:开启服务器的路由转发功能
vm.swappiness=0:禁止使用swap 空间,只有当系统OOM 时才允许使用它
vm.overcommit_memory=1:不检查物理内存是否够用
vm.panic_on_oom=0:开启OOM
net.ipv6.conf.all.disable_ipv6=1:禁止ipv6
//3、执行命令,使其配置文件生效
modprobe br_netfilter
sysctl -p /etc/sysctl.d/kubernetes.conf
可以看到最后一行提示为:sysctl: cannot stat /proc/sys/net/netfilter/nf_conntrack_max: No such file or directory
,这是因为我们当前3.10版本的CentOS内核中,不存在该文件,在后面操作中,我将会升级CentOS内核,升级之后的CentOS内核将包含该文件,所以这里我们暂时忽略该提示
从kubernetes的1.8版本开始,kube-proxy引入了ipvs模式,ipvs模式与iptables同样基于Netfilter,但是ipvs模式采用的是hash表,因此当service数量达到一定规模时,hash查表的速度优势就会显现出来,从而提高service的服务性能
//1、安装ipvsadm 和 ipset
yum -y install ipvsadm ipset
//2、编辑ipvs.modules配置文件,使其永久生效
vim /etc/sysconfig/modules/ipvs.modules
//3、填写如下内容
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
//4、设置文件权限
chmod 755 /etc/sysconfig/modules/ipvs.modules
//5、查看是否已经正确加载所需的内核模块
bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
CentOS内核升级的官方文档:http://elrepo.org/tiki/tiki-index.php
Docker官方对OverlayFS 和 内核版本的要求说明:https://docs.docker.com/storage/storagedriver/overlayfs-driver/
Docker使用OverlayFS作为存储驱动程序,同时Docker为OverlayFS提供了两个存储驱动程序:原始的overlay 和 更新、更稳定的overlay2,但是Docker官方建议如果使用OverlayFS,请使用overlay2驱动程序而不是overlay驱动程序,因为overlay2驱动程序在inode利用率方面更为有效。要使用overlay2驱动程序,就需要Linux内核的版本4.0或更高版本,或者使用3.10.0-514及更高版本的RHEL或CentOS
//1、查看内核版本
uname -r
//2、显示内核版本信息如下
3.10.0-693.el7.x86_64
可以看到centos7 的内核版本,虽然满足条件 (在3.10.0-514之上),但是其内核版本还是比较低的,为了更好的运行docker和kubernetes,建议对centos7的内核进行升级
//1、载入公钥
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
//2、安装ELRepo
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
//3、安装内核 kernel
yum --enablerepo=elrepo-kernel install -y kernel-ml-devel kernel-ml
//1、查看已安装的内核版本
rpm -qa | grep -i kernel
//2、 查找新安装的内核完整名称
cat /boot/grub2/grub.cfg | grep menuentry
可以看到,使用cat /boot/grub2/grub.cfg | grep menuentry
命令,输入的第一行内容中包含新安装的内核完整名称信息,其名称为CentOS Linux (5.5.7-1.el7.elrepo.x86_64) 7 (Core)
方式一:
//1、更改系统内核版本为最新安装版本
grub2-set-default 'CentOS Linux (5.5.7-1.el7.elrepo.x86_64) 7 (Core)'
//2、查看默认启动内核是否更换成功
grub2-editenv list
//3、重启系统
reboot
方式二:
//1、更改系统内核版本为最新安装版本
grub2-set-default 0
//2、查看默认启动内核是否更换成功
grub2-editenv list
//3、重启系统
reboot
提示:由于升级后内核版本是往前面插入的,前面在查看新安装的内核完整名称时,我们也看到新安装的内核信息在第一行输出,所以设置启动顺序为0,即可更改为新内核版本
uname -r
yum -y install wget
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
//1、查询18.09版的docker-ce
yum list available docker-ce* --showduplicates|grep 18.09
//2、安装docker
yum -y install docker-ce-18.09.9-3.el7
//1、设置docker开机自启 和 启动docker
systemctl enable docker && systemctl start docker
//2、查看docker版本
docker --version
阿里云镜像加速器地址获取教程:https://blog.csdn.net/qq_39135287/article/details/101012149#10__150
kubernetes官方安装docker的daemon.json配置文件参考:https://kubernetes.io/docs/setup/production-environment/container-runtimes/
//1、编辑daemon.json配置文件
vim /etc/docker/daemon.json
//2、添加如下内容
{
"registry-mirrors": ["阿里云镜像加速器地址"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
//3、创建一个docker.service.d目录,用于存放docker的配置文件
mkdir -p /etc/systemd/system/docker.service.d
//1、重新加载daemon.json配置文件
systemctl daemon-reload
//2、重启服务器
systemctl restart docker
//1、编辑kubernetes.repo文件
vim /etc/yum.repos.d/kubernetes.repo
//2、添加如下内容
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
解释:
enable=1:表示启用这个源
gpgcheck=1:表示对这个源下载的rpm包进行校验
repo_gpgcheck=1:某些安全性配置文件会在 /etc/yum.conf 内全面启用 repo_gpgcheck,以便能检验软件库中数据的加密签署
提示:由于版本更新频繁,这里指定版本号部署
yum install -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0
//1、编辑kubelet配置文件
vim /etc/sysconfig/kubelet
//2、添加 --fail-swap-on=false参数
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
systemctl enable kubelet
提示:--apiserver-advertise-address需要改成你自己master节点的ip地址
kubeadm init \
--apiserver-advertise-address=192.168.198.145 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.15.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
1、可以看到程序停止在[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
,这是因为它在下载kubernetes相关组件的镜像,所以耐心等待一段时间
2、可以看到安装成功之后,红色方框框起来的两部分内容,在后面的安装过程中需要用上,第一部分内容是用来配置kubectl工具,第二部分内容是在node节点加入时需要此信息
//记录生成token和秘钥,在node节点加入时需要此信息
kubeadm join 192.168.198.145:6443 --token tgmuix.lj2v3b6ogev7yjp6 \
--discovery-token-ca-cert-hash sha256:2328518d9636ebbe4cdc05f1750e2e89071ef7ed98561f16a1b31f97cdcc628a
提示:master节点的cup数量要大于等于2,否则会报如下错误:
[ERROR NumCPU]: the number of available CPUs 1 is less than the required 2
3、查看下载的kubernetes相关组件镜像
docker images
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
由于在下一步的应用flannel网络 kube-flannel.yml配置文件中,使用到了flannel:v0.11.0-amd64镜像,而该镜像下载速度太慢,这里我们提前导入该镜像
flannel:v0.11.0-amd64镜像下载:https://pan.baidu.com/s/11ZUyOK8qB3hhb9YPTwNOrQ 提取码:wq9u
docker load -i $(pwd)/flannel-amd.tar
//如果网速好的话,也可以直接去拉取该镜像
docker push quay.io/coreos/flannel:v0.11.0-amd64
注释:
$(pwd)是docker支持的获取当前目录路径的方法,与linux的pwd类似
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml
如果上面的kube-flannel.yml文件访问不了,可以下载我提供的kube-flannel.yml文件:https://pan.baidu.com/s/1gK1meDTeaZPAitvrCtE-Ow 提取码:ncro
由于在Node节点在加入Kubernetes集群时,也会去下载flannel:v0.11.0-amd64镜像,所以这里我们也提前导入该镜像
docker load -i $(pwd)/flannel-amd.tar
//如果网速好的话,也可以直接去拉取该镜像
docker push quay.io/coreos/flannel:v0.11.0-amd64
注释:
$(pwd)是docker支持的获取当前目录路径的方法,与linux的pwd类似
kubeadm join 192.168.198.145:6443 --token tgmuix.lj2v3b6ogev7yjp6 \
--discovery-token-ca-cert-hash sha256:2328518d9636ebbe4cdc05f1750e2e89071ef7ed98561f16a1b31f97cdcc628a
当看到如下输入信息时,则表示加入Kubernetes集群成功
This node has joined the cluster:
*
Certificate signing request was sent to apiserver and a response was received.
*
The Kubelet was informed of the new secure connection details.
Run ‘kubectl get nodes’ on the control-plane to see this node join the cluster.
提示:如果加入失败,可以使用kubeadm reset
命令进行清理,然后再重新加入
kubectl get componentstatus
kubectl get nodes
可以看到此时,node节点还处在NotReady
状态 (这是由于启动pod需要时间,多等待一段时间即可)
kubectl get pods -n kube-system
可以看到有一个名为kube-flannel-ds-amd64-9jhvs
的pod处于Error
状态 (提示:其实等待一段时间就好了
),此时我们可以通过kubectl describe pod kube-flannel-ds-amd64-9jhvs -n kube-system
命令查看其详情
可以看到在kube-flannel容器Back-off restarting failed
之后,又重新创建并启动了kube-flannel容器
Running
状态)//1、查看节点状态
kubectl get nodes
//2、查看pod状态
kubectl get pods -n kube-system
//1、安装epel-release 和 bash-completion
yum install -y epel-release bash-completion
//2、配置kubectl命令自动补全
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
//3、测试配置是否成功
kubectl tab键
提示:资源类型为configmap 可以简写成 cm
//1、编辑kube-proxy
kubectl edit cm kube-proxy -n kube-system
//2、修改mode
mode: "" 修改为 mode: "ipvs"
kubectl get pod -n kube-system |grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'
提示:如果执行如下命令,没有结果输出,请耐心等待一段时间,再执行如下命令,启动pod也是需要花一段时间的
kubectl get pods -n kube-system | grep kube-proxy
ipvsadm -Ln
提示:资源类型为service 可以简写成 svc
kubectl get svc
Kubernetes 1.6 已经支持(alpha阶段)节点问题的表示。换句话说,当某种条件为真时,node controller会自动给节点添加一个 taint(污点),Taints(污点) and Tolerations(容忍) - Kubernetes文档
//查看污点标记
kubectl get no -o yaml | grep taint -A 5
可以看到只有Master节点被打上了NoSchedule
无法调度的污点
//1、拉取radial/busyboxplus镜像
docker pull radial/busyboxplus
//2、创建deployment类型资源 (deployment控制器会启动pod)
kubectl run -it busyboxplus --image=radial/busyboxplus
//3、解析其ClusterIP
nslookup kubernetes
可以看到kubernetes解析的ClusterIP地址为10.96.0.1
,与我们之前查看资源类型为svc的kubernetes的ClusterIP地址一致,同时还能看到kube-dns对应的ClusterIP地址为10.96.0.10
由于HarBor镜像仓库需要更多的资源,所以这里我选择是Registry镜像仓库
registry镜像仓库的搭建:https://blog.csdn.net/qq_39135287/article/details/103307664
如果Master节点服务器配置比较高 或者 电脑配置比较高可以虚拟出多台虚拟机的话,可以尝试搭建 企业级容器镜像仓库HarBor:https://blog.csdn.net/qq_39135287/article/details/104041772
由于我的电脑配置低,虚拟一台虚拟机安装HarBor镜像仓库会导致电脑运行很卡,所以这里我直接选择在Master节点上安装registry镜像仓库,提示:安装好镜像仓库后,不要忘了在所有节点(包括master节点) 的daemon.json配置文件中,配置镜像仓库的地址,让docker信任私有仓库地址
//方式一:生成永久token,--ttl 0:表示设置永不过期 (不安全,不推荐)
kubeadm token create --ttl 0
//方式二:生成临时token,有效期为一天 (可以保证集群安全性,推荐)
kubeadm token create
//查看生成的token
kubeadm token list
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
通过新生成的 token 和 ca证书sha256编码的hash值 重新组装得到有效的 kubeadm join命令
kubeadm join 192.168.198.145:6443 --token gzxm5g.z2n80zos0ior1ln8 \
--discovery-token-ca-cert-hash sha256:9a39cca67b506c8c7b4e59bc9e8e934b1c779342ed159f2318ce9ca2533cf58f
kubeadm reset
ifconfig cni0 down
ip link delete cni0
ifconfig flannel.1 down
ip link delete flannel.1
rm -rf /var/lib/cni/
Kubernetes入门到实践系列文章列表:
Kubernetes入门到实践 (一) Kubernetes介绍 与 yum安装Kubernetes集群
Kubernetes入门到实践 (二) Kubeadm安装Kubernetes集群
如果有遇到不懂或者有问题时,可以扫描下方二维码,欢迎进群交流与分享,希望能够跟大家交流学习!