文章目录
- Kubernetes 入门
- k8s 特点
- 架构图
- 核心组件
- 工作流程
- k8s 部署
- 节点规划
- 环境准备
- 基础软件安装
- docker 安装
- K8s 安装
- 部署Master 节点
- 部署node 节点
- 部署网络插件(calico)
- 测试 k8s
- 补充内容
- 清理环境
Kubernetes 入门
Kubernetes 是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes 提供了应用部署,规划,更新,维护的一种机制。
Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。 Google 在 2014 年开源了 Kubernetes 项目。 Kubernetes 建立在 Google 大规模运行生产工作负载十几年经验的基础上, 结合了社区中最优秀的想法和实践。
k8s 特点
K8s 能帮住我们批量编排容器,实现服务自我修复、弹性伸缩、自动部署和回滚、服务发现和负载均衡、权限和配置管理、存储编排、批处理 等功能,相比于其他容器编排工具,如 swarm 、 mesos ,优势在于,能够基于 Google 庞大的生态圈及社区产生的产品。通过 Pods 这一抽象的概念,解决 Container 之间的依赖于通信问题。Pods,Services,Deployments 是独立部署的部分,可以通过 Selector 提供更多的灵活性。内置服务注册表和负载平衡。适用度更广,功能更强大。
架构图
核心组件
- ETCD:分布式高性能键值数据库,存储整个集群的所有元数据
- ApiServer: API服务器,集群资源访问控制入口,提供restAPI及安全访问控制
- Scheduler:调度器,负责把业务容器调度到最合适的Node节点
- Controller Manager:控制器管理,确保集群资源按照期望的方式运行
- Replication Controller
- Node controller
- ResourceQuota Controller
- Namespace Controller
- ServiceAccount Controller
- Tocken Controller
- Service Controller
- Endpoints Controller
- kubelet:运行在每运行在每个节点上的主要的“节点代理”个节点上的主要的“节点代理”
- pod 管理:kubelet 定期从所监听的数据源获取节点上 pod/container 的期望状态(运行什么容器、运行的副本数量、网络或者存储如何配置等等),并调用对应的容器平台接口达到这个状态。
- 容器健康检查:kubelet 创建了容器之后还要查看容器是否正常运行,如果容器运行出错,就要根据 pod 设置的重启策略进行处理.
- 容器监控:kubelet 会监控所在节点的资源使用情况,并定时向 master 报告,资源使用数据都是通过 cAdvisor 获取的。知道整个集群所有节点的资源情况,对于 pod 的调度和正常运行至关重要
- kubectl: 命令行接口,用于对 Kubernetes 集群运行命令 https://kubernetes.io/zh/docs/reference/kubectl/
- CNI实现: 通用网络接口, 我们可以使用calico/flannel来作为k8s集群的网络插件, 实现跨节点通信
工作流程
- 用户准备一个资源文件(记录了业务应用的名称、镜像地址等信息),通过调用APIServer执行创建Pod
- APIServer收到用户的Pod创建请求,将Pod信息写入到etcd中
- 调度器通过list-watch的方式,发现有新的pod数据,但是这个pod还没有绑定到某一个节点中
- 调度器通过调度算法,计算出最适合该pod运行的节点,并调用APIServer,把信息更新到etcd中
- kubelet同样通过list-watch方式,发现有新的pod调度到本机的节点了,因此调用容器运行时,去根据pod的描述信息,拉取镜像,启动容器,同时生成事件信息
- 同时,把容器的信息、事件及状态也通过APIServer写入到etcd中
k8s 部署
k8s 部署有四种方式
部署方式 | 简介 | 补充 |
Minikube | minikube 是一个工具, 能让你在本地运行 Kubernetes。 minikube 在你的个人计算机(包括 Windows、macOS 和 Linux PC)上运行一个一体化(all-in-one)或多节点的本地 Kubernetes 集群,以便你来尝试 Kubernetes 或者开展每天的开发工作。 | |
kubeadm | kubeadm 工具来创建和管理 Kubernetes 集群。 该工具能够执行必要的动作并用一种用户友好的方式启动一个可用的、安全的集群。 | 学习采用 |
二进制安装 | 利用 k8s 官方 github 仓库下载二进制包安装,安装过程较复杂,但相对较为稳定,推荐生产环境使用。 | |
命令行工具安装 | yum rpm apt-get brew 等 |
本文采用 kubeadm 来进行学习演示
节点规划
部署k8s集群的节点按照用途可以划分为如下2类角色:
- master:集群的master节点,集群的初始化节点,基础配置不低于2C4G
- slave:集群的slave节点,可以多台,基础配置不低于2C4G
最低配置为 1 master 1 slave ,目前由于只有两台服务器,就采用这种方式
环境准备
软件环境 | 说明 |
linux centos7.6 | |
docker 20.10+ | docker 版本需要和 k8s 适配,并且低版本docker engine 使用高版本发布的镜像会存在一些问题 (容器内的文件权限和用户都是问号) |
K8s 1.23.6 | K8s 在1.24 版本后不再支持原生docker(dockershim), 如果使用1.24版本之后k8s 要么使用社区推荐的containerd(轻量化docker) 要么通过 cri-docker 中间价与docker 进行集成 |
两台服务器上都需要执行的操作
# 设置iptables
iptables -P FORWARD ACCEPT # 不下载iptables 也行
"""
如果节点间无安全组限制(内网机器间可以任意访问),可以忽略,否则,至少保证如下端口可通:
k8s-master节点:TCP:6443,2379,2380,60080,60081UDP协议端口全部打开
k8s-slave节点:UDP协议端口全部打开
"""
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
setenforce 0 # 临时
# 关闭swap
swapoff -a # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
# 关闭完swap后,一定要重启一下虚拟机!!!
# 根据规划设置主机名
hostnamectl set-hostname k8s-master # master 节点
hostnamectl set-hostname k8s-node1 # node 节点
# 在master添加hosts
cat >> /etc/hosts << EOF
192.168.113.120 k8s-master
192.168.113.121 k8s-node1
EOF
# 将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
vm.max_map_count=262144
EOF
sysctl --system # 生效
# 时间同步
yum install ntpdate -y
ntpdate time.windows.com
基础软件安装
docker 安装
- 安装方法
- docker 配置修改
{
"default-runtime": "nvidia",
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
},
# "insecure-registries": ["https://dockerhub.xxx.com"], 内部dockerhub
"registry-mirrors": ["https://4p5gxeik.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"], # 这个一定要改, 默认 cgroups k8s 不支持
"storage-driver": "overlay2",
"storage-opts":["overlay2.override_kernel_check=true"],
"log-driver": "json-file",
"log-opts": {
"max-size": "500m",
"max-file": "3"
},
"oom-score-adjust": -1000,
"bip": "172.20.0.1/16",
"fixed-cidr": "172.20.0.0/16",
"metrics-addr" : "0.0.0.0:9323",
"experimental" : true,
"data-root": "/data/docker",
"default-address-pools": [
{"base": "10.252.0.0/24", "size": 24},
{"base": "10.252.1.0/24", "size": 24},
{"base": "10.252.2.0/24", "size": 24}]
}
- 重启docker
systemctl daemon-reload && systemctl restart docker
K8s 安装
- 设置阿里yum 源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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
EOF
- 下载 kubeadm kubelet kubectl
yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6
systemctl enable kubelet
部署Master 节点
kubeadm init \
--apiserver-advertise-address=192.168.113.120 \ # 和hosts 对应上
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.6 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
安装完成后,复制执行如下配置
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
部署node 节点
在 k8s master 控制台初始化成功后复制 join 命令
kubeadm join 192.168.113.120:6443 --token w34ha2.66if2c8nwmeat9o7 --discovery-token-ca-cert-hash sha256:20e2227554f8883811c01edd850f0cf2f396589d32b57b9984de3353a7389477
补充
# 如果初始化的 token 不小心清空了,可以通过如下命令获取或者重新申请
# 如果 token 已经过期,就重新申请
kubeadm token create
# token 没有过期可以通过如下命令获取
kubeadm token list
# 获取 --discovery-token-ca-cert-hash 值,得到值后需要在前面拼接上 sha256:
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
openssl dgst -sha256 -hex | sed 's/^.* //'
部署网络插件(calico)
# 在 master 节点上执行
# 下载 calico 配置文件,可能会网络超时, 也可能访问不到,就需要了
curl https://calico-v3-25.netlify.app/archive/v3.25/manifests/calico.yaml -O
# 修改 calico.yaml 文件中的 CALICO_IPV4POOL_CIDR 配置,修改为与初始化的 cidr 相同
# 修改 IP_AUTODETECTION_METHOD 下的网卡名称
# 删除镜像 docker.io/ 前缀,避免下载过慢导致失败
sed -i 's#docker.io/##g' calico.yaml
# 部署插件
kubectl apply -f calico.yaml
# 然后等待即可,通过 kubectl get po -n kube-system 命令查看服务启动情况 如图就正常
测试 k8s
# 创建部署
kubectl create deployment nginx --image=nginx
# 暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
# 查看 pod 以及服务信息
kubectl get pod,svc
# 通过 ip:31682 访问,能访问到就没得问题 ip 可以是master 也可以是 node 的
补充内容
由于Kubernetes master节点默认是不能调度业务pod的。Master节点主要负责集群的管理和控制功能,如调度、API服务、存储集群状态等。默认情况下,Kubernetes集群配置会确保master节点不会被用作Pod的调度目标,以确保控制平面的稳定性和安全性。
我们通过 kubectl get pods -o wide 可以看到上面测试demo 服务是安装在 node 节点上的
因为咱们只有两台服务器,所以需要master 节点也能支持调度pod, master 不支持调度是因为默认有一个污点
可以通过 kubectl describe node k8s-master | grep Tain 命令查看到
去除这个 污点即可
kubectl taint nodes k8s-master node-role.kubernetes.io/master:NoSchedule-
清理环境
如果在集群安装环境中遇到了其他问题, 可以使用下面的命令进行重置
kubeadm reset
fconfig tunl0 down && ip link delete tunl0
rm -rf HOME/.kube
rm -rf /var/lib/calico