由于公司要进行容器化,把在其中的一些心得分享给大家。
1.什么是k8s?
k8s是一个docker容器管理工具
它是一个全新的基于容器技术的分布式架构领先方案,是开源的容器集群管理系统。
在docker的基础上,为容器化的应用提供部署运行,资源调度,服务发现和动态伸缩等一系列完整功能
2.----k8s的优势:
1.容器编排
2.轻量级
3.开源
4.弹性伸缩
5.负载均衡
二:k8s的核心功能
1.自愈: 重新启动失败的容器,在节点不可用时,替换和重新调度节点上的容器,对用户定义的健康检查不响应的容器会被中止,并且在容器准备好服务之前不会把其向客户端广播。
弹性伸缩: 通过监控容器的cpu的负载值,如果这个平均高于80%,增加容器的数量,如果这个平均低于10%,减少容器的数量
服务的自动发现和负载均衡: 不需要修改您的应用程序来使用不熟悉的服务发现机制,Kubernetes 为容器提供了自己的 IP 地址和一组容器的单个 DNS 名称,并可以在它们之间进行负载均衡。
滚动升级和一键回滚: Kubernetes 逐渐部署对应用程序或其配置的更改,同时监视应用程序运行状况,以确保它不会同时终止所有实例。如果出现问题,Kubernetes会为您恢复更改,利用日益增长的部署解决方案的生态系统。
2.核心概念
(1)masterk8s集群的管理节点,负责管理集群,提供集群的资源数据的访问入口
(2)Node node是k8s集群架构中运行pod的服务节点
(3)Pod 运行于Node节点上,若干相关容器的组合,pod内包含的容器运行在同一宿主机上,使用相同的网络命名空间,IP地址和端口,能够通过localhost进行通信
搭建:为了节省资源,本地搭建采用单master节点,两个node来进行部署
环境准备: 服务器配置至少:2核4G 的服务器
| 角色 | 主机名 | ip | 操作系统 | 配置 |
| master | master | 192.168.0.10 | centos 7.8 | 2C 4G |
| node01 | node1 | 192.168.0.11 | centos 7.8 | 2C 4G |
| node02 | node2 | 192.168.0.12 | centos 7.8 | 2C 4G |
更改hosts文件添加主机名与IP映射关系
命令:vim /etc/hosts
192.168.0.10 master192.168.0.11 node1192.168.0.12 node2
关闭防火墙和selinux
systemctl stop firewalld #临时关闭防火墙setenforce 0 #关闭selinux,临时关闭永久关闭:sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
由于kubernetes最新升级到v20.1 并支持containerd, 也支持docker,但最终选择还是选择了kubernetes 1.19.5版本来进行安装
本文采用 kubernetes.io 官方推荐的 kubeadm 工具安装 kubernetes 集群。
首先:
检查 centos 的 hostname
# 在 master 节点和 worker 节点都要执行
# 不能使用 localhost 作为节点的名字
# 用 lscpu 命令,核对 CPU 信息
# Architecture: x86_64 目前暂时不支持arm架构
# CPU(s): 2 CPU 内核数量不能低于 2
操作系统最好使用centos 7.6 7.7 7.8
修改 hostname
# 修改 hostname
hostnamectl set-hostname 对应的主机名
hostnamectl set-hostname master
# 查看修改结果
hostnamectl status
# 设置 hostname 解析
echo "127.0.0.1 $(hostname)" >> /etc/hosts
检查网络
在所有节点执行命令
ip route show
所有节点上 Kubernetes 所使用的 IP 地址必须可以互通(无需 NAT 映射、无安全组或防火墙隔离)
master与node都要执行
使用阿里云 docker hub 镜像,脚本如下,另脚本放在百度云中:
链接: https://pan.baidu.com/s/1_Y_Vpas1syA8IvAjC0nHBA 提取码: dhpi
export REGISTRY_MIRROR=https://registry.cn-hangzhou.aliyuncs.co
#!/bin/bash# 在 master 节点和 worker 节点都要执行# 安装 docker# 参考文档如下# https://docs.docker.com/install/linux/docker-ce/centos/# https://docs.docker.com/install/linux/linux-postinstall/# 卸载旧版本yum remove -y docker \docker-client \docker-client-latest \docker-ce-cli \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \docker-engine# 设置 yum repositoryyum install -y yum-utils \device-mapper-persistent-data \lvm2yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# 安装并启动 dockeryum install -y docker-ce-19.03.11 docker-ce-cli-19.03.11 containerd.io-1.2.13mkdir /etc/docker || truecat > /etc/docker/daemon.json <<EOF{"registry-mirrors": ["${REGISTRY_MIRROR}"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"storage-driver": "overlay2","storage-opts": ["overlay2.override_kernel_check=true"]}EOFmkdir -p /etc/systemd/system/docker.service.d# Restart Dockersystemctl daemon-reloadsystemctl enable dockersystemctl restart docker# 安装 nfs-utils# 必须先安装 nfs-utils 才能挂载 nfs 网络存储yum install -y nfs-utilsyum install -y wget# 关闭 防火墙systemctl stop firewalldsystemctl disable firewalld# 关闭 SeLinuxsetenforce 0sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config# 关闭 swapswapoff -ayes | cp /etc/fstab /etc/fstab_bakcat /etc/fstab_bak |grep -v swap > /etc/fstab# 修改 /etc/sysctl.conf# 如果有配置,则修改sed -i "s#^net.ipv4.ip_forward.*#net.ipv4.ip_forward=1#g" /etc/sysctl.confsed -i "s#^net.bridge.bridge-nf-call-ip6tables.*#net.bridge.bridge-nf-call-ip6tables=1#g" /etc/sysctl.confsed -i "s#^net.bridge.bridge-nf-call-iptables.*#net.bridge.bridge-nf-call-iptables=1#g" /etc/sysctl.confsed -i "s#^net.ipv6.conf.all.disable_ipv6.*#net.ipv6.conf.all.disable_ipv6=1#g" /etc/sysctl.confsed -i "s#^net.ipv6.conf.default.disable_ipv6.*#net.ipv6.conf.default.disable_ipv6=1#g" /etc/sysctl.confsed -i "s#^net.ipv6.conf.lo.disable_ipv6.*#net.ipv6.conf.lo.disable_ipv6=1#g" /etc/sysctl.confsed -i "s#^net.ipv6.conf.all.forwarding.*#net.ipv6.conf.all.forwarding=1#g" /etc/sysctl.conf# 可能没有,追加echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.confecho "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.confecho "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.confecho "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.confecho "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.confecho "net.ipv6.conf.lo.disable_ipv6 = 1" >> /etc/sysctl.confecho "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf# 执行命令以应用sysctl -p# 配置K8S的yum源cat <<EOF > /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64enabled=1gpgcheck=0repo_gpgcheck=0gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpghttp://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgEOF# 卸载旧版本yum remove -y kubelet kubeadm kubectl# 安装kubelet、kubeadm、kubectlyum install -y kubelet-1.19.5 kubeadm-1.19.5 kubectl-1.19.5# 重启 docker,并启动 kubeletsystemctl daemon-reloadsystemctl restart dockersystemctl enable kubelet && systemctl start kubeletdocker version
初始化 master 节点:
关于初始化时用到的环境变量
APISERVER_NAME 不能是 master 的 hostname
APISERVER_NAME 必须全为小写字母、数字、小数点,不能包含减号
POD_SUBNET 所使用的网段不能与 master节点/worker节点 所在的网段重叠
# 只在 master 节点执行# 替换 x.x.x.x 为 master 节点的内网IP# export 命令只在当前 shell 会话中有效,开启新的 shell 窗口后,如果要继续安装过程,请重新执行此处的 export 命令export MASTER_IP=x.x.x.x# 我这里192.168.0.10# 替换 apiserver.test 为 您想要的 dnsNameexport APISERVER_NAME=apiserver.test# Kubernetes 容器组所在的网段,该网段安装完成后,由 kubernetes 创建,事先并不存在于您的物理网络中export POD_SUBNET=10.100.0.1/16echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts
脚本如下:
百度网盘地址为:
链接: https://pan.baidu.com/s/1w6YSjbb2V8oL4Zi0LOK2iA 提取码: tb7m
#!/bin/bash# 只在 master 节点执行# 脚本出错时终止执行set -eif [ ${#POD_SUBNET} -eq 0 ] || [ ${#APISERVER_NAME} -eq 0 ]; thenecho -e "\033[31;1m请确保您已经设置了环境变量 POD_SUBNET 和 APISERVER_NAME \033[0m"echo 当前POD_SUBNET=$POD_SUBNETecho 当前APISERVER_NAME=$APISERVER_NAMEexit 1fi# 查看完整配置选项 https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2rm -f ./kubeadm-config.yamlcat <<EOF > ./kubeadm-config.yamlapiVersion: kubeadm.k8s.io/v1beta2kind: ClusterConfigurationkubernetesVersion: v1.19.5imageRepository: registry.aliyuncs.com/k8sxiocontrolPlaneEndpoint: "${APISERVER_NAME}:6443"networking:serviceSubnet: "10.96.0.0/16"podSubnet: "${POD_SUBNET}"dnsDomain: "cluster.local"EOF# kubeadm init# 根据您服务器网速的情况,您需要等候 3 - 10 分钟kubeadm config images pull --config=kubeadm-config.yamlkubeadm init --config=kubeadm-config.yaml --upload-certs# 配置 kubectlrm -rf /root/.kube/mkdir /root/.kube/cp -i /etc/kubernetes/admin.conf /root/.kube/config# 安装 calico 网络插件# 参考文档 https://docs.projectcalico.org/v3.13/getting-started/kubernetes/self-managed-onprem/onpremisesecho "安装calico-3.13.1"rm -f calico-3.13.1.yamlwget https://kuboard.cn/install-script/calico/calico-3.13.1.yamlkubectl apply -f calico-3.13.1.yaml
检查 master 初始化结果
# 只在 master 节点执行# 执行如下命令,等待 3-10 分钟,直到所有的容器组处于 Running 状态watch kubectl get pod -n kube-system -o wide# 查看 master 节点初始化结果kubectl get nodes -o wide
初始化 worker节点
#获得 join命令参数
在 master 节点上执行
# 只在 master 节点执行kubeadm token create --print-join-command
# 只在 worker 节点执行# 替换 x.x.x.x 为 master 节点的内网 IPexport MASTER_IP=x.x.x.x# 我这里的是export MASTER_IP=192.168.0.10# 替换 apiserver.demo 为初始化 master 节点时所使用的 APISERVER_NAMEexport APISERVER_NAME=apiserver.testecho "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts# 替换为 master 节点上 kubeadm token create 命令的输出kubeadm join apiserver.test:6443 --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303
有效时间
该 token 的有效时间为 2 个小时,2小时内,您可以使用此 token 初始化任意数量的 worker 节点
检查初始化结果
在 master 节点上执行
# 只在 master 节点执行kubectl get nodes -o wide# 持续观察watch kubectl get nodes -o wide
输出的结果为:
[root@master~]# kubectl get nodesNAME STATUS ROLES AGE VERSIONmaster Ready master 10m4s v1.19.5node1 Ready <none> 5m27s v1.19.5node2 Ready <none> 5m26s v1.19.5
至此 k8s单master集群,就搭建好了。




