核心组件
- 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创建了容器之后还要检查容器是否正常运行,如果容器运行出错,就要通过容器设置的重启策略进行处理
容器监控:kubelet会监控所在节点的资源使用情况,并定时向master报告 - kubectl:命令行接口,用于对kubernetes集群运行命令
- CNI实现:通过网络接口,我们使用flannel来作为k8s集群的网络插件,实现跨节点通信
主要架构:
工作流程:
- 用户准备了一个资源文件(记录了业务应用的名称,镜像地址等信息),通过调用APIServer执行创建Pod
- APIserver收到用户的Pod创建请求后,将Pod信息写入到etcd中
- 调度器通过list-watch的方式,发现有新的pod数据,但是这个pod还没有绑定到某一个节点中
- 调度器通过调度算法,计算出最适合该pod运行的节点,并调用APIServer,把信息更新到etcd中
- kubelet同样通过list-watch方式,发现有新的pod调度到本机的节点了,因此调用容器运行时,去根据pod的描述信息,拉取镜像,启动容器,同时生成事件信息
- 同时,把容器的信息,事件及状态也通过APIServer写入到etcd中
搭建k8s集群,三台机器
172.16.10.189 master
172.16.10.185 slave1
172.16.10.184 slave1
先设置主机名:其他两台同理
hostnamectl set-hostname k8s-master
添加host解析
cat >> /etc/hosts<<EOF
172.16.10.189 k8s-master
172.16.10.185 k8s-slave1
172.16.10.184 k8s-slave1
EOF
设置yum源
scp -r docker-ce.repo root@172.16.10.189 /etc/yum.repos.d/
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=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
EOF
安装kubelet组件,所有的master和slave都需要执行,kubelet kubectl kubeadm三个组件
yum install -y kubelet-1.16.2 kubeadm-1.16.2 kubectl-1.16.2 --disableexcludes=kubernetes
查看kubeadm版本
kubeadm version
初始化配置文件
操作节点:只在master节点执行
kubeadm config print init-defaults > kubeadm.yaml
vim kubeadm.yaml
kubeadm config images list --config kubeadm.yaml
如果没有问题,将得到以下列表
#提前下载镜像到本地
kubeadm config images pull --config kubeadm.yaml
初始化master节点(只在master节点执行)
kubeadm init --config kubeadm.yaml
我初始化的时候报了
[ERROR DirAvailable–var-lib-etcd]: /var/lib/etcd is not empt
解决办法:直接删除这个目录就好
提示我们按照上述提示信息报错,配置kubectl客户端的认证
之后使用提示命令,将两个slave节点加入到master中
kubeadm join 172.16.10.189:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:eecde65b9f9ecea275e9f03d0224e8ba4431d76c39fa3bd0a6ec101d3431329c
我添加节点时报以下错误,让我们关闭分区
使用 swapoff -a 命令关闭,之后我们看到添加成功
kubectl get node #查看节点信息
我们会看到有三条节点信息,但是状态为NotReady,因为我们还没有装flannel插件
安装flannel插件
下载flannel的yaml文件
---
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: psp.flannel.unprivileged
annotations:
seccomp.security.alpha.kubernetes.io/allowedProfileNames: docker/default
seccomp.security.alpha.kubernetes.io/defaultProfileName: docker/default
apparmor.security.beta.kubernetes.io/allowedProfileNames: runtime/default
apparmor.security.beta.kubernetes.io/defaultProfileName: runtime/default
spec:
privileged: false
volumes:
- configMap
- secret
- emptyDir
- hostPath
allowedHostPaths:
- pathPrefix: "/etc/cni/net.d"
- pathPrefix: "/etc/kube-flannel"
- pathPrefix: "/run/flannel"
readOnlyRootFilesystem: false
# Users and groups
runAsUser:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
fsGroup:
rule: RunAsAny
# Privilege Escalation
allowPrivilegeEscalation: false
defaultAllowPrivilegeEscalation: false
# Capabilities
allowedCapabilities: ['NET_ADMIN', 'NET_RAW']
defaultAddCapabilities: []
requiredDropCapabilities: []
# Host namespaces
hostPID: false
hostIPC: false
hostNetwork: true
hostPorts:
- min: 0
max: 65535
# SELinux
seLinux:
# SELinux is unused in CaaSP
rule: 'RunAsAny'
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: flannel
rules:
- apiGroups: ['extensions']
resources: ['podsecuritypolicies']
verbs: ['use']
resourceNames: ['psp.flannel.unprivileged']
- apiGroups:
- ""
resources:
- pods
verbs:
- get
- apiGroups:
- ""
resources:
- nodes
verbs:
- list
- watch
- apiGroups:
- ""
resources:
- nodes/status
verbs:
- patch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: flannel
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: flannel
subjects:
- kind: ServiceAccount
name: flannel
namespace: kube-system
---
apiVersion: v1
kind