简介
概述

Kubernetes 是 Google 2014 年创建管理的,是 Google 10 多年大规模容器管理技术 Borg 的开源版本。Kubernetes 是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。使用 Kubernetes 我们可以:
- 快速部署应用
- 快速扩展应用
- 无缝对接新的应用功能
- 节省资源,优化硬件资源的使用
Kubernetes 的目标是促进完善组件和工具的生态系统,以减轻应用程序在公有云或私有云中运行的负担。
特点
- 可移植: 支持公有云,私有云,混合云,多重云(多个公共云)
- 可扩展: 模块化,插件化,可挂载,可组合
- 自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展
从传统到容器化部署
传统的部署方式
- 传统的应用部署方式是通过插件或脚本来安装应用。这样做的缺点是应用的运行、配置、管理、所有生存周期将与当前操作系统绑定,这样做并不利于应用的升级更新/回滚等操作,当然也可以通过创建虚机的方式来实现某些功能,但是虚拟机非常重,并不利于可移植性。
容器化部署的优势
- 快速创建/部署应用: 与虚拟机相比,容器镜像的创建更加容易。
- 持续开发、集成和部署: 提供可靠且频繁的容器镜像构建/部署,并使用快速和简单的回滚(由于镜像不可变性)。
- 开发和运行相分离: 在 build 或者 release 阶段创建容器镜像,使得应用和基础设施解耦。
- 开发,测试和生产环境一致性: 在本地或外网(生产环境)运行的一致性。
- 云平台或其他操作系统: 可以在 Ubuntu、RHEL、CoreOS、on-prem、Google Container Engine 或其它任何环境中运行。
- 分布式,弹性,微服务化: 应用程序分为更小的、独立的部件,可以动态部署和管理。
- 资源隔离
- 资源利用更高效
为什么需要 Kubernetes
可以在物理或虚拟机的 Kubernetes 集群上运行容器化应用,Kubernetes 能提供一个以 “容器为中心的基础架构”,满足在生产环境中运行应用的一些常见需求,如:
- 多个进程协同工作
- 存储系统挂载
- 应用健康检查
- 应用实例的复制
- 自动伸缩/扩展
- 注册与发现
- 负载均衡
- 滚动更新
- 资源监控
- 日志访问
- 调试应用程序
- 提供认证和授权
集群安装准备
本次安装采用 CentOS 8 版本安装 kubernetes 集群环境,集群节点为 1 主 2 从模式,此次对虚拟机会有些基本要求,如下:
- OS:CentOS Linux release 8.1.1911
- CPU:最低要求,2 CPU 2 核
- 内存:最低要求,2GB
- 磁盘:最低要求,20GB
节点准备(3个节点)
- 具体配置详情
| 主机名称 | IP | 角色 | CPU/内存 | 磁盘 |
|---|---|---|---|---|
| k8smaster | 192.168.233.200 | master | 2核/2G | 20G |
| k8snode01 | 192.168.233.210 | node | 2核/4G | 20G |
| k8snode02 | 192.168.233.211 | node | 2核/4G | 20G |
系统基础配置(每个节点都需要)
配置固定IP地址
分别为每个节点配置固定IP地址:点击了解
配置Hosts
分别在每个节点的/etc/hosts 追加配置
1
2
3echo "192.168.233.200 k8smaster
192.168.233.210 k8snode01
192.168.233.211 k8snode02" >>/etc/hosts
配置HostName
根据节点规划分别配置对应的/etc/hostname
1
hostnamectl set-hostname <HOSTNAME>
如:
hostnamectl set-hostname k8smaster
hostnamectl set-hostname k8snode01
hostnamectl set-hostname k8snode02
查看hostname配置
1
hostnamectl
Static hostname: k8smaster
Icon name: computer-vmChassis: vmMachine ID: ef8884ea25f948beb7f8278d18789f2e
Boot ID: cc67657a70f14ddcbbcfe724df79981cVirtualization: oracle
Operating System: CentOS Linux 8 (Core)
CPE OS Name: cpe:/o:centos:centos:8Kernel: Linux 4.18.0-147.el8.x86_64Architecture: x86-64
关闭交换空间
交换空间对虚拟化资源损耗较大,成本损耗较高,一般虚拟化技术是不允许开启交换空间的,如果不关闭交换空间,k8s初始时也会有相应的提示信息。
关闭交换空间
1
sudo swapoff -a
避免开机启动交换空间:注释 /etc/fstab 中的 swap
1
vi /etc/fstab
#注释掉这一行并保存
#/dev/mapper/cl-swap swap swap defaults 0 0
查看交换空间
1
free -h
total used free shared buff/cache available Mem: 1.8Gi 896Mi 101Mi 9.0Mi 831Mi 862Mi Swap: 0B 0B 0B
关闭防火墙
防火墙操作:点击了解
关闭selinux
临时关闭
1
setenforce 0
永久关闭,避免开启启动
1
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
时间同步
k8s集群保证每个节点时间是同步的,需要同步节点时间
时间同步操作:点击了解
写入k8s.conf
一些 RHEL/CentOS 7 的用户曾经遇到过问题:由于 iptables 被绕过而导致流量无法正确路由的问题。您应该确保 在
sysctl配置中的1
2
3
4
5
6cat > /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.swappiness=0
EOF执行命令使修改生效
1
2
3sysctl -f /etc/sysctl.d/k8s.conf
或
sysctl --system
Docker相关
安装docker
docker安装操作:点击了解
安装docker-compose
docker-compose安装操作:点击了解)
修改daemon.json
配置docker阿里云加速,以及修改docker的cgroupdriver驱动
修改或创建/etc/docker/daemon.json,加入下面的内容:
1
2
3
4
5
6
7
8
9
10
11
12sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://l46iaapq.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
安装 kubeadm
kubeadm 是 kubernetes 的集群安装工具,能够快速安装 kubernetes 集群。
配置kubernetes软件源
kubernetes阿里云源
1
2
3
4
5
6
7echo "[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" >>/etc/yum.repos.d/kubernetes.repo
安装工具
安装kubernetes所需工具
kubelet、kubeadm、kubectl
1
sudo dnf install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
启动kubelet
安装完成后启动 kubelet服务
1
systemctl enable --now kubelet
配置kubeadm
概述
安装 kubernetes 主要是安装它的各个镜像,而 kubeadm 已经为我们集成好了运行 kubernetes 所需的基本镜像。但由于国内的网络原因,在搭建环境时,无法拉取到这些镜像。此时我们只需要修改为阿里云提供的镜像服务即可解决该问题。
配置文件
创建文件存储路径
1
mkdir -p /usr/local/docker/kubernetes && cd /usr/local/docker/kubernetes
获取默认配置
1
kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm-config.yml
编辑获取到的文件
1
vi kubeadm-config.yml
调整里面主要注释的几个地方
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
# 改为自己的 master 地址
advertiseAddress: 192.168.233.200
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: k8smaster
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
# 由于国外镜像过慢,调整为阿里云镜像仓库
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.17.4
networking:
dnsDomain: cluster.local
# 配置成 Calico 的默认网段
podSubnet: 192.168.0.0/16
serviceSubnet: 10.96.0.0/12
scheduler: {}
---
# 开启 IPVS 模式
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
SupportIPVSProxyMode: true
mode: ipvs
查看和拉取镜像
查看镜像文件版本
1
kubeadm config images list --config kubeadm-config.yml
registry.aliyuncs.com/google_containers/kube-apiserver:v1.17.4
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.17.4
registry.aliyuncs.com/google_containers/kube-scheduler:v1.17.4
registry.aliyuncs.com/google_containers/kube-proxy:v1.17.4
registry.aliyuncs.com/google_containers/pause:3.1
registry.aliyuncs.com/google_containers/etcd:3.4.3-0
registry.aliyuncs.com/google_containers/coredns:1.6.5拉取配置中所需的镜像
1
kubeadm config images pull --config kubeadm-config.yml
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-apiserver:v1.17.4
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-controller-manager:v1.17.4
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-scheduler:v1.17.4
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-proxy:v1.17.4
[config/images] Pulled registry.aliyuncs.com/google_containers/pause:3.1
[config/images] Pulled registry.aliyuncs.com/google_containers/etcd:3.4.3-0
[config/images] Pulled registry.aliyuncs.com/google_containers/coredns:1.6.5
使用kubeadm初始化mstaer
初始化并配置
初始化主节点
初始化master
1
kubeadm init --config=kubeadm-config.yml --upload-certs | tee kubeadm-init.log
初始化过程日志输出:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68[init] Using Kubernetes version: v1.17.4
[preflight] Running pre-flight checks
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Starting the kubelet
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [k8smaster kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 192.168.233.200]
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [k8smaster localhost] and IPs [192.168.233.200 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [k8smaster localhost] and IPs [192.168.233.200 127.0.0.1 ::1]
[certs] Generating "etcd/healthcheck-client" certificate and key
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Generating "sa" key and public key
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
[control-plane] Using manifest folder "/etc/kubernetes/manifests"
[control-plane] Creating static Pod manifest for "kube-apiserver"
[control-plane] Creating static Pod manifest for "kube-controller-manager"
[control-plane] Creating static Pod manifest for "kube-scheduler"
[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[apiclient] All control plane components are healthy after 18.507655 seconds
[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[kubelet] Creating a ConfigMap "kubelet-config-1.17" in namespace kube-system with the configuration for the kubelets in the cluster
[upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace
[upload-certs] Using certificate key:
a4c99ea3701d5245d6ee81a04ed4d041340fd7d5cf837f1e53c8536151ae78f1
[mark-control-plane] Marking the node k8smaster as control-plane by adding the label "node-role.kubernetes.io/master=''"
[mark-control-plane] Marking the node k8smaster as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule]
[bootstrap-token] Using token: abcdef.0123456789abcdef
[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstrap-token] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstrap-token] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.233.200:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:8e523ebfd1ecd1fdb3578d254d94e60067e987ce3e9ad6c71af0245dea04d14b
注意:如果安装 kubernetes 版本和下载的镜像版本不统一则会出现
timed out waiting for the condition错误。中途失败或是想修改配置可以使用kubeadm reset命令重置配置,再做初始化操作即可。
配置 kubectl
依据上面日志输出的信息进行配置操作
创建kube文件夹
1
mkdir -p $HOME/.kube
复制配置文件到config路径
1
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
授权,将配置文件授权给当前用户
1
sudo chown $(id -u):$(id -g) $HOME/.kube/config
验证配置
查看节点
1
kubectl get node
[root@k8smaster kubernetes]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8smaster NotReady master 3h37m v1.17.4至此主节点配置完成
kubeadm init 的执行过程
- init:指定版本进行初始化操作
- preflight:初始化前的检查和下载所需要的 Docker 镜像文件
- kubelet-start:生成 kubelet 的配置文件
var/lib/kubelet/config.yaml,没有这个文件 kubelet 无法启动,所以初始化之前的 kubelet 实际上启动不会成功 - certificates:生成 Kubernetes 使用的证书,存放在
/etc/kubernetes/pki目录中 - kubeconfig:生成 KubeConfig 文件,存放在
/etc/kubernetes目录中,组件之间通信需要使用对应文件 - control-plane:使用
/etc/kubernetes/manifest目录下的 YAML 文件,安装 Master 组件 - etcd:使用
/etc/kubernetes/manifest/etcd.yaml安装 Etcd 服务 - wait-control-plane:等待 control-plan 部署的 Master 组件启动
- apiclient:检查 Master 组件服务状态。
- uploadconfig:更新配置
- kubelet:使用 configMap 配置 kubelet
- patchnode:更新 CNI 信息到 Node 上,通过注释的方式记录
- mark-control-plane:为当前节点打标签,打了角色 Master,和不可调度标签,这样默认就不会使用 Master 节点来运行 Pod
- bootstrap-token:生成 token 记录下来,后边使用
kubeadm join往集群中添加节点时会用到 - addons:安装附加组件 CoreDNS 和 kube-proxy
使用kubeadm配置slave节点
概述
将 slave 节点加入到集群中很简单,只需要在 slave 服务器上安装 kubeadm,kubectl,kubelet 三个工具,然后使用 kubeadm join 命令加入即可。准备工作如下:
将node加入到集群
执行初始化master节点时候输出日志的kubeadm join命令,将node节点加入到集群中
执行命令
1
2kubeadm join 192.168.233.200:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:8e523ebfd1ecd1fdb3578d254d94e60067e987ce3e9ad6c71af0245dea04d14b
说明:
- token
- 可以通过安装 master 时的日志查看 token 信息
- 可以通过
kubeadm token list命令打印出 token 信息 - 如果 token 过期,可以使用
kubeadm token create命令创建新的 token
- discovery-token-ca-cert-hash
- 可以通过安装 master 时的日志查看 sha256 信息
- 可以通过
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'命令查看 sha256 信息
验证是否成功
回到master,输入命令验证
1
kubectl get nodes
[root@k8smaster kubernetes]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8smaster NotReady master 3h37m v1.17.4
k8snode01 NotReady node 3h34m v1.17.4查看 pod 状态
1
kubectl get pod -n kube-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
coredns-9d85f5447-7p478 0/1 Pending 0 6h23m
coredns-9d85f5447-dctn9 0/1 Pending 0 6h23m
etcd-k8smaster 1/1 Running 0 6h23m 192.168.233.200 k8smaster
kube-apiserver-k8smaster 1/1 Running 0 6h23m 192.168.233.200 k8smaster
kube-controller-manager-k8smaster 1/1 Running 0 6h23m 192.168.233.200 k8smaster
kube-proxy-bn8lx 1/1 Running 1 6h23m 192.168.233.200 k8smaster
kube-proxy-jsw59 1/1 Running 1 6h18m 192.168.233.210 k8snode01
kube-proxy-s5q54 1/1 Running 1 5h3m 192.168.233.211 k8snode02
kube-scheduler-k8smaster 1/1 Running 0 6h23m 192.168.233.200 k8smaster由此可以看出 coredns 尚未运行,此时我们还需要安装网络插件。
配置网络
容器网络是容器选择连接到其他容器、主机和外部网络的机制。容器的 runtime 提供了各种网络模式,每种模式都会产生不同的体验。例如,Docker 默认情况下可以为容器配置以下网络:
- none: 将容器添加到一个容器专门的网络堆栈中,没有对外连接。
- host: 将容器添加到主机的网络堆栈中,没有隔离。
- default bridge: 默认网络模式。每个容器可以通过 IP 地址相互连接。
- 自定义网桥: 用户定义的网桥,具有更多的灵活性、隔离性和其他便利功能。
什么是 CNI
CNI(Container Network Interface) 是一个标准的,通用的接口。在容器平台,Docker,Kubernetes,Mesos 容器网络解决方案 flannel,calico,weave。只要提供一个标准的接口,就能为同样满足该协议的所有容器平台提供网络功能,而 CNI 正是这样的一个标准接口协议。
Kubernetes 中的 CNI 插件
CNI 的初衷是创建一个框架,用于在配置或销毁容器时动态配置适当的网络配置和资源。插件负责为接口配置和管理 IP 地址,并且通常提供与 IP 管理、每个容器的 IP 分配、以及多主机连接相关的功能。容器运行时会调用网络插件,从而在容器启动时分配 IP 地址并配置网络,并在删除容器时再次调用它以清理这些资源。
运行时或协调器决定了容器应该加入哪个网络以及它需要调用哪个插件。然后,插件会将接口添加到容器网络命名空间中,作为一个 veth 对的一侧。接着,它会在主机上进行更改,包括将 veth 的其他部分连接到网桥。再之后,它会通过调用单独的 IPAM(IP地址管理)插件来分配 IP 地址并设置路由。
在 Kubernetes 中,kubelet 可以在适当的时间调用它找到的插件,为通过 kubelet 启动的 pod进行自动的网络配置。
Kubernetes 中可选的 CNI 插件如下:
- Flannel
- Calico
- Canal
- Weave
什么是 Calico
Calico 为容器和虚拟机提供了安全的网络连接解决方案,并经过了大规模生产验证(在公有云和跨数千个集群节点中),可与 Kubernetes,OpenShift,Docker,Mesos,DC / OS 和 OpenStack 集成。
Calico 还提供网络安全规则的动态实施。使用 Calico 的简单策略语言,您可以实现对容器,虚拟机工作负载和裸机主机端点之间通信的细粒度控制
安装配置Calico
官网链接:点击访问
应用网络配置文件
1
kubectl apply -f https://docs.projectcalico.org/v3.11/manifests/calico.yaml
查看容器状态
1
watch kubectl get pods --all-namespaces
需要先下载镜像文件,略作等待所有的镜像文件下载完成,并运行状态为Running说明配置成功。
Every 2.0s: kubectl get pods –all-namespaces k8smaster: Wed Mar 25 13:24:46 2020
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-5b644bc49c-rlf9g 1/1 Running 0 81m
kube-system calico-node-fvqlg 1/1 Running 0 8m30s
kube-system calico-node-ltd5p 1/1 Running 0 81m
kube-system calico-node-zwbg7 1/1 Running 0 81m
kube-system coredns-9d85f5447-7p478 1/1 Running 0 87m
kube-system coredns-9d85f5447-dctn9 1/1 Running 0 87m
kube-system etcd-k8smaster 1/1 Running 0 88m
kube-system kube-apiserver-k8smaster 1/1 Running 0 88m
kube-system kube-controller-manager-k8smaster 1/1 Running 0 88m
kube-system kube-proxy-bn8lx 1/1 Running 1 87m
kube-system kube-proxy-jsw59 1/1 Running 1 82m
kube-system kube-proxy-s5q54 1/1 Running 1 8m30s
kube-system kube-scheduler-k8smaster 1/1 Running 0 88m
概念总结
什么是 Kubernetes
Kubernetes 是一个开源的 Docker 容器编排系统,它可以调度计算集群的节点,动态管理上面的作业,保证它们按用户期望的状态运行。通过使用「labels」和「pods」的概念,Kubernetes 将应用按逻辑单元进行分组,方便管理和服务发现。
{% asset_img k8s-jiagou01.jpg 架构图%}
- pods: 是一组紧密关联的容器集合,它们共享 IPC(进程间通信)、Network(网络) 和 UTS namespace(UTS 命名空间是 Linux 命名空间的一个子系统,主要作用是完成对容器 Hostname 和 Domain 的隔离,同时保存内核名称、版本、以及底层体系结构类型等信息),是 Kubernetes 调度的基本单位。
- labels: 键值对(key/value)标签,可以被关联到如 Pod 这样的对象上,主要作用是给用户一个直观的感受,比如这个 Pod 是用来放置数据库的
- GUI: 用户图形界面,可以是 Web 用户界面,比如使用
kubernetes-dashboard组件,用户可以通过 Dashboard 在 Kubernetes 集群中部署容器化的应用,可以查看集群中应用的运行情况,同时也能够基于 Dashboard 创建或修改部署、任务、服务等 Kubernetes 的资源。通过部署向导,用户能够对部署进行扩缩容,进行滚动更新、重启 Pod 和部署新应用。当然,通过 Dashboard 也能够查看 Kubernetes 资源的状态 - kubectl: 用于管理 Kubernetes 集群的命令行工具
- kube-apiserver: 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制
- Kubernetes Master: Kubernetes 集群主节点,主要由
kube-apiserver、kube-scheduler、kube-controller-manager、etcd四个模块组成 - Kubernetes Node: Kubernetes 集群子节点,主要由
kubelet、kube-proxy、runtime三个模块组成 - Image Registry: 镜像仓库,比如:Ducker HUB 或 Docker 私服
Kubernetes Master
{% asset_img k8s-jiagou02.jpg 架构图%}
- kube-apiserver: 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制
- kube-scheduler: 负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上
- kube-controller-manager: 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等
- etcd: CoreOS 基于 Raft 开发的分布式 key-value 存储,可用于服务发现、共享配置以及一致性保障(如数据库选主、分布式锁等)
Kubernetes Node
{% asset_img k8s-jiagou03.jpg 架构图%}
- runtime: 负责镜像管理以及 Pod 和容器的真正运行(CRI,Container Runtime Interface),默认的容器运行时为 Docker,还支持 RKT 容器
- kubelet: 负责维持容器的生命周期,同时也负责 Volume(CVI,Container Volume Interface)和网络(CNI,Container Network Interface)的管理
- kube-proxy: 负责为 Service 提供 cluster 内部的服务发现和负载均衡
Kubernetes 架构
{% asset_img k8s-jiagou04.jpg 架构图%}
{% asset_img k8s-jiagou05.jpg 架构图%}