上一篇: 2 深入理解Pod kubernetes集群由master和worker节点组成,master节点和worker节点合成node节点。节点上运行若干的系统组件服务。
3.1 master节点
master是Kubernetes集群的大脑,运行着的daemon服务包含kube-apiserver,kube-scheduler,kube-controller-manager, etcd服务(大型生产环境一般单独部署)。
3.1.1 API Server(kube-apiserver)
Kubernetes API Server提供HTTP/HTTPS RESTful API ,集群的入口,各种客户端工具(CLI或第三方工具UI)以及其他组件可通过它管理集群的各种资源,所有对象资源的增删改查和监听操作都交给
APIServer处理后再提交给Etcd存储。kubeadm安装k8S,以容器化运行。
3.1.2 Scheduler Server(kube-scheduler)
根据调度算法为新创建的Pod选择一个Node节点,同一业务服务,可以部署在同一Node节点上,也可以部署在不同的Node节点上。
3.1.3 Controller Manager(kube-controller-manager)
Controller Manager 负责管理集群各种资源,保证资源处于预期的状态。Controller Manager由多种controller 组成,包括replication controller、 endpoints controller、namespace controller、serviceaccounts controller等。
不同的controller管理不同的资源。例如,replication controller 管理Deployment、StatefulSet、DaemonSet 的生命周期,namespace controller管理Namespace 资源。
3.1.4 etcd
分布式键值存储系统数据库,用于保存集群状态数据和配置信息,比如Pod、Service等对象信息。
3.2 worker节点
3.2.1 kubelet
Kubelet 就是负责所有运行在工作节点上内容的组件,它第一个任务就是在 API 服务器中创建 Node 资源来注册该节点。然后需要持续监控 API 服务器是否把该节点分配给 pod 然后启动 pod 容器,具体实现方式是告知配置好的容器引擎(docker、containerd)来从特定容器镜像运行容器。 kubelet 随后持续监控运行的容器,向 API 服务器报告它们的状态、事件和 资源消耗。kubelet 也是运行容器存活探针的组件,当探针报错时它会重启容器。最后一点,当pod从API 服务器删除肘, kubelet 终止容器,并通知服务器 pod 己经被终止了。
3.2.2 kube-proxy
service在逻辑上代表了后端的多个Pod,外界通过service 访问Pod。 service 接收到的请求是如何转发到Pod 的呢?这就是kube-proxy 要完成的工作。每个Node都会运行kube-proxy 服务,它负责将访问service 的TCP/UPD数据流转发到后端的容器。如果有多个副本,kube-proxy 会实现负载均衡。负载均衡通常实现由iptables或者ipvs实现,默认是iptables。
3.3 woker部署
了解集群的架构后,我们来部署一台worker节点加入到集群中。第一章一键部署的k8s节点,其实为master节点兼任worker节点,本次再部署一台worker节点,稍微修改原来的脚本后直接运行可以完成大部分的部署:
vi k8s-mini-install.sh
# 配置主机名
hostnamectl set-hostname k8s-worker01
echo "192.168.3.81 k8s-master" >> /etc/hosts
echo "192.168.3.84 k8s-worker01" >> /etc/hosts
# 下载docker yum源
yum install -y wget
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# 增加kubernetes源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[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
# 关闭selinux
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
# 关闭firewalld
systemctl disable firewalld --now
# 关闭交换分区
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 更新yum源
# 启用ipv4转发
cat > /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
vm.swappiness=0
EOF
sysctl --system
# 安装docker
yum install docker-ce-19.03.* -y
systemctl enable docker --now
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://v16stybc.mirror.aliyuncs.com"],
"exec-opts":["native.cgroupdriver=systemd"],
"log-driver":"json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver":"overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
EOF
systemctl restart docker
# 安装k8s
yum install -y kubelet-1.19.6 kubeadm-1.19.6 kubectl-1.19.6
systemctl enable kubelet --now
在原来的master节点执行,重新生成新的token
# kubeadm token create --print-join-command
W1111 17:50:25.985706 292853 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
kubeadm join 192.168.3.81:6443 --token sc2ty3.ej38ceisi5lmt9ad --discovery-token-ca-cert-hash sha256:42bf6e526b795854b61b7c0ca875f9a8292b989d44f0f51a4d8dec450711b89e
回到worker01节点执行, 就可以完成worker01的安装
kubeadm join 192.168.3.81:6443 --token sc2ty3.ej38ceisi5lmt9ad --discovery-token-ca-cert-hash sha256:42bf6e526b795854b61b7c0ca875f9a8292b989d44f0f51a4d8dec450711b89e
安装其他worker节点也按照以上的步骤。