Kubernetes基础

第 1 章: Kubernetes 入门

Kubernetes 是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置
和自动化。Kubernetes拥有一个庞大且快速增长的生态系统。Kubernetes 的服务、支持和工具广泛可用。

一、 kubernetes简介

Kubernetes 是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置
和自动化。Kubernetes拥有一个庞大且快速增长的生态系统。Kubernetes 的服务、支持和工具广泛可用。一、
简介Kubernetes是一个全新的基于容器技术的分布式领先方案。简称:K 8 S。它是Google开源的容器集群管
理系统,它的设计灵感来自于Google内部的一个叫作Borg的容器管理系统。继承了Google十余年的容器集
群使用经验。它为容器化的应用提供了部署运行、资源调度、服务发现和动态伸缩等一些列完整的功能,极大地
提高了大规模容器集群管理的便捷性。

​ kubernetes是一个完备的分布式系统支撑平台。具有完备的集群管理能力,多扩多层次的安全防护和准入机
制、多租户应用支撑能力、透明的服务注册和发现机制、內建智能负载均衡器、强大的故障发现和自我修复能力、
服务滚动升级和在线扩容能力、可扩展的资源自动调度机制以及多粒度的资源配额管理能力。

​ 在集群管理方面,Kubernetes将集群中的机器划分为一个Master节点和一群工作节点Node,其中,在Master
节点运行着集群管理相关的一组进程kube-apiserver、kube-controller-manager和kube-scheduler,这些进程
实现了整个集群的资源管理、Pod调度、弹性伸缩、安全控制、系统监控和纠错等管理能力,并且都是全自动完
成的。Node作为集群中的工作节点,运行真正的应用程序,在Node上Kubernetes管理的最小运行单元是Pod。
Node上运行着Kubernetes的kubelet、kube-proxy服务进程,这些服务进程负责Pod的创建、启动、监控、
重启、销毁以及实现软件模式的负载均衡器。

​ 在Kubernetes集群中,它解决了传统IT系统中服务扩容和升级的两大难题。如果今天的软件并不是特别复
杂并且需要承载的峰值流量不是特别多,那么后端项目的部署其实也只需要在虚拟机上安装一些简单的依赖,将
需要部署的项目编译后运行就可以了。但是随着软件变得越来越复杂,一个完整的后端服务不再是单体服务,而
是由多个职责和功能不同的服务组成,服务之间复杂的拓扑关系以及单机已经无法满足的性能需求使得软件的部
署和运维工作变得非常复杂,这也就使得部署和运维大型集群变成了非常迫切的需求。

​ Kubernetes 的出现不仅主宰了容器编排的市场,更改变了过去的运维方式,不仅将开发与运维之间边界变
得更加模糊,而且让 DevOps 这一角色变得更加清晰,每一个软件工程师都可以通过 Kubernetes 来定义服务
之间的拓扑关系、线上的节点个数、资源使用量并且能够快速实现水平扩容、蓝绿部署等在过去复杂的运维操作。

1 、 架构

Kubernetes 遵循非常传统的客户端服务端架构,客户端通过 RESTful 接口或者直接使用 kubectl 与
Kubernetes 集群进行通信,这两者在实际上并没有太多的区别,后者也只是对 Kubernetes 提供的 RESTful
API进行封装并提供出来。每一个 Kubernetes 集群都由一组 Master 节点和一系列的 Worker节点组成,其
中 Master 节点主要负责存储集群的状态并为 Kubernetes 对象分配和调度资源。

  1. 1 、 Master

它主要负责接收客户端的请求,安排容器的执行并且运行控制循环,将集群的状态向目标状态进行迁移,

Master 节点内部由三个组件构成:

    1. 1 、 APIServer

​ 负责处理来自用户的请求,其主要作用就是对外提供 RESTful的接口,包括用于查看集群状态的读请求以及
改变集群状态的写请求,也是唯一一个与 etcd 集群通信的组件。

    1. 2 、 ControllerController

管理器运行了一系列的控制器进程,这些进程会按照用户的期望状态在后台不断地调节整个集群中的对象,

当服务的状态发生了改变,控制器就会发现这个改变并且开始向目标状态迁移。

    1. 3 、 SchedulerScheduler

​ 调度器其实为 Kubernetes 中运行的 Pod选择部署的 Worker节点,它会根据用户的需要选择最能满足请
求的节点来运行 Pod,它会在每次需要调度 Pod 时执行。

  1. 2 、 Node

​ Node节点实现相对简单一点,主要是由kubelet和kube-proxy两部分组成:kubelet是一个节点上的主要
服务,它周期性地从 APIServer 接受新的或者修改的 Pod 规范并且保证节点上的 Pod和其中容器的正常运
行,还会保证节点会向目标状态迁移,该节点仍然会向 Master 节点发送宿主机的健康状况。 kube-proxy 负
责宿主机的子网管理,同时也能将服务暴露给外部,其原理就是在多个隔离的网络中把请求转发给正确的 Pod
或者容器。

  1. 3 、 kubernetes结构图

在这张系统架构图中,我们把服务分为运行在工作节点上的服务和组成集群级别控制板的服务。

Kubernetes主要由以下几个核心组件组成:
1. etcd保存了整个集群的状态
2. apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等
机制
3. controllermanager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等
4. scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上
5. kubelet负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理
6. Containerruntime负责镜像管理以及Pod和容器的真正运行(CRI)
7. kube-proxy负责为Service提供cluster内部的服务发现和负载均衡

## 除了核心组件,还有一些推荐的组件:
1 .kube-dns负责为整个集群提供DNS服务
2 .IngressController为服务提供外网入口
3 .Heapster提供资源监控
4 .Dashboard提供GUIFederation提供跨可用区的集群
5 .Fluentd-elasticsearch提供集群日志采集、存储与查询

第 2 章: kubernetes 部署篇

一、 kubeadm部署篇

Kubernetes有两种方式,第一种是二进制的方式,可定制但是部署复杂容易出错;第二种是kubeadm工具
安装,部署简单,不可定制化。本次我们部署kubeadm版。

1 、 部署系统版本

软件 版本

CentOS CentOSLinuxrelease 7. 7. 1908 (Core)
Docker 19. 03. 12
Kubernetes V 1. 19. 1
Flannel V 0. 13. 0
Kernel-lm kernel-lt- 4. 4. 245 - 1 .el 7 .elrepo.x 86 _ 64 .rpm
Kernel-lm-devel kernel-lt-devel- 4. 4. 245 - 1 .el 7 .elrepo.x 86 _ 64 .rpm

2 、 节点规划

Hostname Ip 内核版本
k 8 s-master- 01 192. 168. 12. 11 4. 4. 245 - 1 .el 7 .elrepo.x 86 _ 64
K 8 s-node- 01 192. 168. 12. 12 4. 4. 245 - 1 .el 7 .elrepo.x 86 _ 64
K 8 s-node- 02 192. 168. 12. 13 4. 4. 245 - 1 .el 7 .elrepo.x 86 _ 64

3 、 关闭 selinux

## # 永久关闭

sed -i 's#enforcing#disabled#g' /etc/selinux/config
# 零时关闭
setenforce 0

4 、 关闭 swap 分区

一旦触发swap,会导致系统性能急剧下降,所以一般情况下,K 8 S要求关闭swap分区。
swapoff -a
sed -i.bak 's/^.*centos-swap/#&/g' /etc/fstab
echo 'KUBELET_EXTRA_ARGS="--fail-swap-on=false"' > /etc/sysconfig/kubelet

5 、 配置国内 yum

默认情况下,CentOS使用的是官方yum源,所以一般情况下在国内使用是非常慢,所以我们可以替换成
国内的一些比较成熟的yum源,例如:清华大学镜像源,网易云镜像源等等。
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
curl -o /etc/yum.repos.d/CentOS-Base.repo
https://mirrors.aliyun.com/repo/Centos- 7 .repo
curl -o /etc/yum.repos.d/epel.repo [http://mirrors.aliyun.com/repo/epel-](http://mirrors.aliyun.com/repo/epel-) 7 .repo

# 刷新缓存
yum makecache

# 更新系统
yum update -y --exclud=kernel*

6 、 升级内核版本

由于Docker运行需要较新的系统内核功能,例如ipvs等等,所以一般情况下,我们需要使用 4. 0 +以上版
本的系统内核。
# 内核要求是 4. 18 +,如果是`CentOS 8 `则不需要升级内核

wget
https://elrepo.org/linux/kernel/el 7 /x 86 _ 64 /RPMS/kernel-lt- 4. 4. 245 - 1 .el 7 .elrepo.x
86 _ 64 .rpm
wget
https://elrepo.org/linux/kernel/el 7 /x 86 _ 64 /RPMS/kernel-lt-devel- 4. 4. 245 - 1 .el 7 .el
repo.x 86 _ 64 .rpm

yum localinstall -y kernel-lt*

grub 2 - set-default 0 && grub 2 - mkconfig -o /etc/grub 2 .cfg

grubby --default-kernel

# 重启
reboot

7 、 安装 ipvs

ipvs是系统内核中的一个模块,其网络转发性能很高。一般情况下,我们首选ipvs。

# 安装IPVS
yum install -y conntrack-tools ipvsadm ipset conntrack libseccomp

## # 加载IPVS模块

cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr
ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack"
for kernel_module in \${ipvs_modules}; do
/sbin/modinfo -F filename \${kernel_module} > /dev/null 2 >& 1
if [ $? -eq 0 ]; then
/sbin/modprobe \${kernel_module}
fi
done
EOF

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash
/etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs

8 、 内核参数优化

内核参数优化的主要目的是使其更适合kubernetes的正常运行。
cat > /etc/sysctl.d/k 8 s.conf << EOF
net.ipv 4 .ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip 6 tables = 1
fs.may_detach_mounts = 1
vm.overcommit_memory= 1
vm.panic_on_oom= 0
fs.inotify.max_user_watches= 89100
fs.file-max= 52706963
fs.nr_open= 52706963
net.ipv 4 .tcp_keepalive_time = 600
net.ipv 4 .tcp.keepaliv.probes = 3
net.ipv 4 .tcp_keepalive_intvl = 15
net.ipv 4 .tcp.max_tw_buckets = 36000
net.ipv 4 .tcp_tw_reuse = 1
net.ipv 4 .tcp.max_orphans = 327680
net.ipv 4 .tcp_orphan_retries = 3
net.ipv 4 .tcp_syncookies = 1
net.ipv 4 .tcp_max_syn_backlog = 16384
net.ipv 4 .ip_conntrack_max = 65536
net.ipv 4 .tcp_max_syn_backlog = 16384
net.ipv 4 .top_timestamps = 0
net.core.somaxconn = 16384
EOF

# 立即生效
sysctl --system

9 、 安装基础软件

## 安装一些基础软件,是为了方便我们的日常使用。

yum install wgetexpectvimnet-toolsntpbash-completionipvsadmipsetjq iptables
conntrack sysstat libseccomp -y

10 、关闭防火墙

## 关闭防火墙是为了方便日常使用,不会给我们造成困扰。在生成环境中建议打开。

systemctl disable --now firewalld

11 、安装 Docker

Docker主要是作为k 8 s管理的常用的容器工具之一。

  1. 1 、 CentOS 7 版
yum install -y yum-utils device-mapper-persistent-data lvm 2
yum-config-manager --add-repo
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum install docker-ce -y
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https:// 8 mh 75 mhz.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload ; systemctl restart docker;systemctl enable --now
docker.service
  1. 2 、 CentOS 8 版
wget
https://download.docker.com/linux/centos/ 7 /x 86 _ 64 /stable/Packages/containerd.io-
1. 2. 13 - 3. 2 .el 7 .x 86 _ 64 .rpm
yum install containerd.io- 1. 2. 13 - 3. 2 .el 7 .x 86 _ 64 .rpm -y
yum install -y yum-utils device-mapper-persistent-data lvm 2
yum-config-manager --add-repo
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum install docker-ce -y
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'

{

"registry-mirrors": ["https:// 8 mh 75 mhz.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload ; systemctl restart docker;systemctl enable --now
docker.service

12 、同步集群时间

在集群当中,时间是一个很重要的概念,一旦集群当中某台机器时间跟集群时间不一致,可能会导致集群面
临很多问题。所以,在部署集群之前,需要同步集群当中的所有机器的时间。

  1. 1 、 CentOS 7 版
yum install ntp -y

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 'Asia/Shanghai' > /etc/timezone

ntpdate time 2 .aliyun.com

## # 写入定时任务

*/ 1 * * * * ntpdate time 2 .aliyun.com > /dev/null 2 >& 1

12. 2 、 **CentOS 8 版**

rpm -ivh [http://mirrors.wlnmp.com/centos/wlnmp-release-centos.noarch.rpm](http://mirrors.wlnmp.com/centos/wlnmp-release-centos.noarch.rpm)
yum install wntp -y

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 'Asia/Shanghai' > /etc/timezone

ntpdate time 2 .aliyun.com

# 写入定时任务
*/ 1 * * * * ntpdate time 2 .aliyun.com > /dev/null 2 >& 1

13 、配置 Kubernetes

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el 7 - x 86 _ 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
EOF

setenforce 0

yum install -y kubelet kubeadm kubectl

systemctl enable kubelet && systemctl start kubelet

## 14 、节点初始化

kubeadm init \

- -image-repository=registry.cn-hangzhou.aliyuncs.com/k 8 sos \
- -kubernetes-version=v 1. 18. 8 \
- -service-cidr= 10. 96. 0. 0 / 12 \
- -pod-network-cidr= 10. 244. 0. 0 / 16

  1. 1 、 配置kubernetes用户信息
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

14. 2 、 增加命令提示

yum install -y bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc

15 、安装集群网络插件

kubernetes需要使用第三方的网络插件来实现kubernetes的网络功能,这样一来,安装网络插件成为必要
前提;第三方网络插件有多种,常用的有flanneld、calico和cannel(flanneld+calico),不同的网络组件,都
提供基本的网络功能,为各个Node节点提供IP网络等。
docker pull registry.cn-hangzhou.aliyuncs.com/k 8 sos/flannel:v 0. 12. 0 - amd 64 ;\
docker tag registry.cn-hangzhou.aliyuncs.com/k 8 sos/flannel:v 0. 12. 0 - amd 64 \
quay.io/coreos/flannel:v 0. 12. 0 - amd 64

kubectl apply -f
https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flann
el.yml

16 、 Node 节点加入集群

## # 创建TOKEN

kubeadm token create --print-join-command

# node节点加入集群
kubeadm join 10. 0. 0. 50 : 6443 - -token 038 qwm.hpoxkc 1 f 2 fkgti 3 r \

- -discovery-token-ca-cert-hash
sha 256 :edcd 2 c 212 be 408 f 741 e 439 abe 304711 ffb 0 adbb 3 bedbb 1 b 93354 bfdc 3 dd 13 b 04

17 、查看部署结果

kubectl get nodes -o wide

二、 二进制部署篇

1 、 环境初始化

1. 1 、 软件系统版本

软件 版本

CentOS CentOSLinuxrelease 7. 7. 1908 (Core)
Docker 19. 03. 12
Kubernetes V 1. 18. 8
Flannel V 0. 13. 0
Kernel-lm 4. 18 +
Kernel-lm-devel 4. 18 +
Haproxy 1. 5. 18
Keepalived 1. 3. 5

## 1. 2 、 集群 规划

Hostname Ip 内网IP 内核版本
kubernetes-master- 01 192. 168. 12. 50 172. 16. 0. 50 4. 4. 245 - 1 .el 7 .elrepo.x 86 _ 64
kubernetes-master- 02 192. 168. 12. 51 172. 16. 0. 51 4. 4. 245 - 1 .el 7 .elrepo.x 86 _ 64
kubernetes-master- 03 192. 168. 12. 52 172. 16. 0. 52 4. 4. 245 - 1 .el 7 .elrepo.x 86 _ 64
kubernetes-node- 01 192. 168. 12. 53 172. 16. 0. 53 4. 4. 245 - 1 .el 7 .elrepo.x 86 _ 64
kubernetes-node- 02 192. 168. 12. 54 172. 16. 0. 54 4. 4. 245 - 1 .el 7 .elrepo.x 86 _ 64

kubernetes-node-vip 172. 16. 0. 55 VIP虚拟节点

1. 3 、 配置HOSTS解析

cat >> /etc/hosts <<EOF

172. 16. 0. 50 kubernetes-master- 01
172. 16. 0. 51 kubernetes-master- 02
172. 16. 0. 52 kubernetes-master- 03
172. 16. 0. 53 kubernetes-node- 01
172. 16. 0. 54 kubernetes-node- 02
172. 16. 0. 56 kubernetes-master-vip

EOF

## 1. 4 、 集群各节点免密登录

ssh-keygen -t rsa

for i in kubernetes-master- 01 kubernetes-master- 02 kubernetes-master- 03
kubernetes-node- 01 kubernetes-node- 02 kubernetes-master-vip ; do ssh-copy-id -i
~/.ssh/id_rsa.pub root@$i ; done

1. 5 、 **关闭selinux**

## # 永久关闭

sed -i 's#enforcing#disabled#g' /etc/sysconfig/selinux
# 零时关闭
setenforce 0

1. 6 、 **关闭swap分区**

一旦触发swap,会导致系统性能急剧下降,所以一般情况下,K 8 S要求关闭swap分区。
swapoff -a

sed -i.bak 's/^.*centos-swap/#&/g' /etc/fstab
echo 'KUBELET_EXTRA_ARGS="--fail-swap-on=false"' > /etc/sysconfig/kubelet
  1. 7 、 配置国内yum源
默认情况下,CentOS使用的是官方yum源,所以一般情况下在国内使用是非常慢,所以我们可以替换成
国内的一些比较成熟的yum源,例如:清华大学镜像源,网易云镜像源等等。
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
curl -o /etc/yum.repos.d/CentOS-Base.repo
https://mirrors.aliyun.com/repo/Centos- 7 .repo
curl -o /etc/yum.repos.d/epel.repo [http://mirrors.aliyun.com/repo/epel-](http://mirrors.aliyun.com/repo/epel-) 7 .repo

# 刷新缓存
yum makecache

# 更新系统
yum update -y --exclud=kernel*

## 1. 8 、 升级内核版本

由于Docker运行需要较新的系统内核功能,例如ipvs等等,所以一般情况下,我们需要使用 4. 0 +以上版
本的系统内核。

# 内核要求是 4. 18 +,如果是`CentOS 8 `则不需要升级内核

wget
https://elrepo.org/linux/kernel/el 7 /x 86 _ 64 /RPMS/kernel-lt- 4. 4. 245 - 1 .el 7 .elrepo.x
86 _ 64 .rpm
wget
https://elrepo.org/linux/kernel/el 7 /x 86 _ 64 /RPMS/kernel-lt-devel- 4. 4. 245 - 1 .el 7 .el
repo.x 86 _ 64 .rpm

yum localinstall -y kernel-lt*

grub 2 - set-default 0 && grub 2 - mkconfig -o /etc/grub 2 .cfg

grubby --default-kernel

## # 重启

reboot
  1. 9 、 安装ipvs
ipvs是系统内核中的一个模块,其网络转发性能很高。一般情况下,我们首选ipvs。
# 安装IPVS
yum install -y conntrack-tools ipvsadm ipset conntrack libseccomp

# 加载IPVS模块
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr
ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack"
for kernel_module in \${ipvs_modules}; do
/sbin/modinfo -F filename \${kernel_module} > /dev/null 2 >& 1
if [ $? -eq 0 ]; then
/sbin/modprobe \${kernel_module}
fi
done
EOF

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash
/etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs

1. 10 、 内核参数优化

内核参数优化的主要目的是使其更适合kubernetes的正常运行。
cat > /etc/sysctl.d/k 8 s.conf << EOF
net.ipv 4 .ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip 6 tables = 1
fs.may_detach_mounts = 1
vm.overcommit_memory= 1
vm.panic_on_oom= 0
fs.inotify.max_user_watches= 89100
fs.file-max= 52706963
fs.nr_open= 52706963
net.ipv 4 .tcp_keepalive_time = 600
net.ipv 4 .tcp.keepaliv.probes = 3
net.ipv 4 .tcp_keepalive_intvl = 15
net.ipv 4 .tcp.max_tw_buckets = 36000
net.ipv 4 .tcp_tw_reuse = 1
net.ipv 4 .tcp.max_orphans = 327680
net.ipv 4 .tcp_orphan_retries = 3
net.ipv 4 .tcp_syncookies = 1
net.ipv 4 .tcp_max_syn_backlog = 16384
net.ipv 4 .ip_conntrack_max = 65536
net.ipv 4 .tcp_max_syn_backlog = 16384
net.ipv 4 .top_timestamps = 0
net.core.somaxconn = 16384
EOF

# 立即生效
sysctl --system

1. 11 、 安装基础软件

## 安装一些基础软件,是为了方便我们的日常使用。

yum install wgetexpectvimnet-toolsntpbash-completionipvsadmipsetjq iptables
conntrack sysstat libseccomp -y

1. 12 、 关闭防火墙

## 关闭防火墙是为了方便日常使用,不会给我们造成困扰。在生成环境中建议打开。

systemctl disable --now firewalld

2 、 安装 Docker

Docker主要是作为k 8 s管理的常用的容器工具之一。

  1. 1 、 CentOS 7 版
yum install -y yum-utils device-mapper-persistent-data lvm 2
yum-config-manager --add-repo
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum install docker-ce -y
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https:// 8 mh 75 mhz.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload ; systemctl restart docker;systemctl enable --now
docker.service
  1. 2 、 CentOS 8 版
wget
https://download.docker.com/linux/centos/ 7 /x 86 _ 64 /stable/Packages/containerd.io-
1. 2. 13 - 3. 2 .el 7 .x 86 _ 64 .rpm
yum install containerd.io- 1. 2. 13 - 3. 2 .el 7 .x 86 _ 64 .rpm -y
yum install -y yum-utils device-mapper-persistent-data lvm 2
yum-config-manager --add-repo
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum install docker-ce -y
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https:// 8 mh 75 mhz.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload ; systemctl restart docker;systemctl enable --now
docker.service

3 、 同步集群时间

在集群当中,时间是一个很重要的概念,一旦集群当中某台机器时间跟集群时间不一致,可能会导致集群面

临很多问题。所以,在部署集群之前,需要同步集群当中的所有机器的时间。

  1. 1 、 CentOS 7 版
yum install ntp -y

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 'Asia/Shanghai' > /etc/timezone

ntpdate time 2 .aliyun.com

# 写入定时任务
*/ 1 * * * * ntpdate time 2 .aliyun.com > /dev/null 2 >& 1
  1. 2 、 CentOS 8 版
rpm -ivh [http://mirrors.wlnmp.com/centos/wlnmp-release-centos.noarch.rpm](http://mirrors.wlnmp.com/centos/wlnmp-release-centos.noarch.rpm)
yum install wntp -y

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 'Asia/Shanghai' > /etc/timezone

ntpdate time 2 .aliyun.com

## # 写入定时任务

*/ 1 * * * * ntpdate time 2 .aliyun.com > /dev/null 2 >& 1

4 、 集群证书

kubernetes组件众多,这些组件之间通过 HTTP/GRPC相互通信,以协同完成集群中应用的部署和管理工
作。尤其是master节点,更是掌握着整个集群的操作。其安全就变得尤为重要了,在目前世面上最安全的,使
用最广泛的就是数字证书。kubernetes正是使用这种认证方式。

4. 1 、 证书原理

  1. 2 、 安装cfssl证书生成工具

本次我们使用cfssl证书生成工具,这是一款把预先的证书机构、使用期等时间写在json文件里面会更加高
效和自动化。cfssl采用go语言编写,是一个开源的证书管理工具,cfssljson用来从cfssl程序获取json输出,
并将证书,密钥,csr和bundle写入文件中。

## # 下载

wget https://pkg.cfssl.org/R 1. 2 /cfssl_linux-amd 64
wget https://pkg.cfssl.org/R 1. 2 /cfssljson_linux-amd 64

# 设置执行权限
chmod +x cfssljson_linux-amd 64
chmod +x cfssl_linux-amd 64

# 移动到/usr/local/bin
mv cfssljson_linux-amd 64 cfssljson
mv cfssl_linux-amd 64 cfssl
mv cfssljson cfssl /usr/local/bin

4. 3 、 创建集群根证书

从整个架构来看,集群环境中最重要的部分就是etcd和APIserver。所以集群当中的证书都是针对etcd和
apiserver来设置的。

所谓根证书,是CA认证中心与用户建立信任关系的基础,用户的数字证书必须有一个受信任的根证书,用
户的数字证书才是有效的。从技术上讲,证书其实包含三部分,用户的信息,用户的公钥,以及证书签名。CA
负责数字证书的批审、发放、归档、撤销等功能,CA颁发的数字证书拥有CA的数字签名,所以除了CA自身,
其他机构无法不被察觉的改动。

mkdir -p /opt/cert/ca

cat > /opt/cert/ca/ca-config.json <<EOF
{
"signing": {
"default": {
"expiry": " 8760 h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": " 8760 h"
}
}
}
}
EOF

4. 3. 1 、 证书详解

  1. default是默认策略,指定证书默认有效期是 1 年
  2. profiles是定义使用场景,这里只是kubernetes,其实可以定义多个场景,分别指定不同的过期时间,使用场
    景等参数,后续签名证书时使用某个profile;
  3. signing:表示该证书可用于签名其它证书,生成的ca.pem证书
  4. serverauth:表示client 可以用该CA对server提供的证书进行校验;
  5. clientauth:表示server 可以用该CA对client 提供的证书进行验证。

4. 4 、 创建根CA证书签名请求文件

cat > /opt/cert/ca/ca-csr.json << EOF
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names":[{
"C": "CN",
"ST": "ShangHai",
"L": "ShangHai"
}]
}
EOF

4. 4. 1 、 证书详解

## 证书项 解释

## C 国家

## ST 省

## L 城市

## O 组织

## OU 组织别名

4. 5 、 生成根证书

[root@kubernetes-master- 01 ca]#cfsslgencert-initcaca-csr.json|cfssljson-bare
ca -
2020 / 08 / 28 23 : 51 : 50 [INFO] generating a new CA key and certificate from CSR
2020 / 08 / 28 23 : 51 : 50 [INFO] generate received request
2020 / 08 / 28 23 : 51 : 50 [INFO] received CSR
2020 / 08 / 28 23 : 51 : 50 [INFO] generating key: rsa- 2048
2020 / 08 / 28 23 : 51 : 50 [INFO] encoded CSR
2020 / 08 / 28 23 : 51 : 50 [INFO] signed certificate with serial number
66427391707536599498414068348802775591392574059
[root@kubernetes-master- 01 ca]# ll
总用量 20

- rw-r--r-- 1 root root 282 8 月 28 23 : 41 ca-config.json
- rw-r--r-- 1 root root 1013 8 月 28 23 : 51 ca.csr
- rw-r--r-- 1 root root 196 8 月 28 23 : 41 ca-csr.json
- rw------- 1 root root 1675 8 月 28 23 : 51 ca-key.pem
- rw-r--r-- 1 root root 1334 8 月 28 23 : 51 ca.pem

4. 5. 1 、 参数详解

参数项 解释

gencert 生成新的key(密钥)和签名证书

  • -initca 初始化一个新CA证书

5 、 部署 Etcd 集群

Etcd是基于Raft的分布式key-value存储系统,由CoreOS团队开发,常用于服务发现,共享配置,以及
并发控制(如leader选举,分布式锁等等)。Kubernetes使用Etcd进行状态和数据存储!

5. 1 、 ETCD集群规划

## ETCD节点 IP

Etcd- 01 172. 16. 0. 50
Etcd- 02 172. 16. 0. 51
Etcd- 03 172. 16. 0. 52

5. 2 、 创建ETCD证书

mkdir -p /opt/cert/etcd
cd /opt/cert/etcd

cat > etcd-csr.json << EOF
{
"CN": "etcd",
"hosts": [
" 127. 0. 0. 1 ",
" 172. 16. 0. 50 ",
" 172. 16. 0. 51 ",
" 172. 16. 0. 52 ",
" 172. 16. 0. 53 ",
" 172. 16. 0. 54 "
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "ShangHai",
"L": "ShangHai"
}
]
}
EOF

5. 3 、 生成证书

[root@kubernetes-master- 01 etcd]# cfssl gencert -ca=../ca/ca.pem

- ca-key=../ca/ca-key.pem -config=../ca/ca-config.json -profile=kubernetes
etcd-csr.json | cfssljson -bare etcd
2020 / 08 / 29 00 : 02 : 20 [INFO] generate received request
2020 / 08 / 29 00 : 02 : 20 [INFO] received CSR
2020 / 08 / 29 00 : 02 : 20 [INFO] generating key: rsa- 2048
2020 / 08 / 29 00 : 02 : 20 [INFO] encoded CSR
2020 / 08 / 29 00 : 02 : 20 [INFO] signed certificate with serial number
71348009702526539124716993806163559962125770315
[root@kubernetes-master- 01 etcd]# ll
总用量 16
- rw-r--r-- 1 root root 1074 8 月 29 00 : 02 etcd.csr
- rw-r--r-- 1 root root 352 8 月 28 23 : 59 etcd-csr.json
- rw------- 1 root root 1675 8 月 29 00 : 02 etcd-key.pem
- rw-r--r-- 1 root root 1460 8 月 29 00 : 02 etcd.pem

5. 3. 1 、 参数详解

## 参数项 解释

gencert 生成新的key(密钥)和签名证书

- initca 初始化一个新ca
- ca-key 指明ca的证书
- config 指明ca的私钥文件
- profile 指明请求证书的json文件
- ca 与config中的profile对应,是指根据config中的profile段来生成证书的相关信息

5. 4 、 分发证书

for ip in kubernetes-master- 01 kubernetes-master- 02 kubernetes-master- 03
do
ssh root@${ip} "mkdir -pv /etc/etcd/ssl"
scp ../ca/ca*.pem root@${ip}:/etc/etcd/ssl
scp ./etcd*.pem root@${ip}:/etc/etcd/ssl
done

for ip in kubernetes-master- 01 kubernetes-master- 02 kubernetes-master- 03 ; do
ssh root@${ip} "ls -l /etc/etcd/ssl";
done

5. 5 、 部署ETCD

## # 下载ETCD安装包

wget https://mirrors.huaweicloud.com/etcd/v 3. 3. 24 /etcd-v 3. 3. 24 - linux-amd 64 .tar.gz

# 解压
tar xf etcd-v 3. 3. 24 - linux-amd 64

# 分发至其他节点
for i in kubernetes-master- 02 kubernetes-master- 01 kubernetes-master- 03
do
scp ./etcd-v 3. 3. 24 - linux-amd 64 /etcd* root@$i:/usr/local/bin/
done

## # 查看ETCD安装是否成功

[root@kubernetes-master- 01 etcd-v 3. 3. 24 - linux-amd 64 ]# etcd --version
etcd Version: 3. 3. 24
Git SHA: bdd 57848 d
Go Version: go 1. 12. 17
Go OS/Arch: linux/amd 64

5. 6 、 注册ETCD服务

将etcd注册systemd服务主要是为了方便管理ETCD。
mkdir -pv /etc/kubernetes/conf/etcd
ETCD_NAME=`hostname`
INTERNAL_IP=`hostname -i`
INITIAL_CLUSTER=kubernetes-master- 01 =https:// 172. 16. 0. 50 : 2380 ,kubernetes-master-
02 =https:// 172. 16. 0. 51 : 2380 ,kubernetes-master- 03 =https:// 172. 16. 0. 52 : 2380

cat << EOF | sudo tee /usr/lib/systemd/system/etcd.service
[Unit]
Description=etcd
Documentation=https://github.com/coreos

[Service]
ExecStart=/usr/local/bin/etcd \\

- -name ${ETCD_NAME} \\
- -cert-file=/etc/etcd/ssl/etcd.pem \\
- -key-file=/etc/etcd/ssl/etcd-key.pem \\
- -peer-cert-file=/etc/etcd/ssl/etcd.pem \\
- -peer-key-file=/etc/etcd/ssl/etcd-key.pem \\
- -trusted-ca-file=/etc/etcd/ssl/ca.pem \\
- -peer-trusted-ca-file=/etc/etcd/ssl/ca.pem \\
- -peer-client-cert-auth \\
- -client-cert-auth \\
- -initial-advertise-peer-urls https://${INTERNAL_IP}: 2380 \\
- -listen-peer-urls https://${INTERNAL_IP}: 2380 \\
- -listen-client-urls https://${INTERNAL_IP}: 2379 ,https:// 127. 0. 0. 1 : 2379 \\
- -advertise-client-urls https://${INTERNAL_IP}: 2379 \\
- -initial-cluster-token etcd-cluster \\
- -initial-cluster ${INITIAL_CLUSTER} \\
- -initial-cluster-state new \\
- -data-dir=/var/lib/etcd
Restart=on-failure
RestartSec= 5

[Install]
WantedBy=multi-user.target
EOF

5. 6. 1 、 配置项详解

## 配置选项 选项说明

name 节点名称
data-dir 指定节点的数据存储目录
listen-peer-urls 与集群其它成员之间的通信地址
listen-client-urls 监听本地端口,对外提供服务的地址
initial-advertise-peer-urls 通告给集群其它节点,本地的对等URL地址
advertise-client-urls 客户端URL,用于通告集群的其余部分信息
initial-cluster 集群中的所有信息节点
initial-cluster-token 集群的token,整个集群中保持一致
initial-cluster-state 初始化集群状态,默认为new

- -cert-file 客户端与服务器之间TLS证书文件的路径
- -key-file 客户端与服务器之间TLS密钥文件的路径
- -peer-cert-file 对等服务器TLS证书文件的路径
- -peer-key-file 对等服务器TLS密钥文件的路径
- -trusted-ca-file 签名client证书的CA证书,用于验证client证书
- -peer-trusted-ca-file 签名对等服务器证书的CA证书。
- -trusted-ca-file 签名client证书的CA证书,用于验证client证书
- -peer-trusted-ca-file 签名对等服务器证书的CA证书。

5. 6. 2 、 启动 ETCD

## # 在三台节点上执行

systemctl enable --now etcd

5. 6. 3 、 测试 ETCD 集群

ETCDCTL_API= 3 etcdctl \

- -cacert=/etc/etcd/ssl/etcd.pem \
- -cert=/etc/etcd/ssl/etcd.pem \
- -key=/etc/etcd/ssl/etcd-key.pem \
- -endpoints="https:// 172. 16. 0. 50 : 2379 ,https:// 172. 16. 0. 51 : 2379 ,https:// 172. 16. 0.
52 : 2379 " \
endpoint status --write-out='table'
ETCDCTL_API= 3 etcdctl \

- -cacert=/etc/etcd/ssl/etcd.pem \
- -cert=/etc/etcd/ssl/etcd.pem \
- -key=/etc/etcd/ssl/etcd-key.pem \
- -endpoints="https:// 172. 16. 0. 50 : 2379 ,https:// 172. 16. 0. 51 : 2379 ,https:// 172. 16. 0.
52 : 2379 " \
member list --write-out='table'

6 、 部署集群 master 节点

  1. 1 、 master节点规划
## 主机名(角色) IP 外网 IP
Kubernetes-master- 01 172. 16. 0. 50 192. 168. 12. 50
Kubernetes-master- 02 172. 16. 0. 51 192. 168. 12. 51
Kubernetes-master- 03 172. 16. 0. 52 192. 168. 12. 52

6. 2 、 创建集群证书

Master节点是集群当中最为重要的一部分,组件众多,部署也最为复杂。
[root@kubernetes-master- 01 k 8 s]# mkdir /opt/cert/k 8 s
[root@kubernetes-master- 01 k 8 s]# cd /opt/cert/k 8 s
[root@kubernetes-master- 01 k 8 s]# pwd
/opt/cert/k 8 s
[root@kubernetes-master- 01 k 8 s]# cat > ca-config.json << EOF
{
"signing": {
"default": {
"expiry": " 87600 h"
},
"profiles": {
"kubernetes": {
"expiry": " 87600 h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
EOF

6. 3 、 创建根证书签名

[root@kubernetes-master- 01 k 8 s]# cat > ca-csr.json << EOF
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "ShangHai",
"ST": "ShangHai"
}
]
}
EOF

[root@kubernetes-master- 01 k 8 s]# ll
total 8

- rw-r--r-- 1 root root 294 Sep 13 19 : 59 ca-config.json
- rw-r--r-- 1 root root 212 Sep 13 20 : 01 ca-csr.json

6. 4 、 生成根证书

[root@kubernetes-master- 01 k 8 s]#cfsslgencert-initcaca-csr.json|cfssljson-bare
ca -
2020 / 09 / 13 20 : 01 : 45 [INFO] generating a new CA key and certificate from CSR
2020 / 09 / 13 20 : 01 : 45 [INFO] generate received request
2020 / 09 / 13 20 : 01 : 45 [INFO] received CSR
2020 / 09 / 13 20 : 01 : 45 [INFO] generating key: rsa- 2048
2020 / 09 / 13 20 : 01 : 46 [INFO] encoded CSR
2020 / 09 / 13 20 : 01 : 46 [INFO] signed certificate with serial number
588993429584840635805985813644877690042550093427
[root@kubernetes-master- 01 k 8 s]# ll
total 20

- rw-r--r-- 1 root root 294 Sep 13 19 : 59 ca-config.json
- rw-r--r-- 1 root root 960 Sep 13 20 : 01 ca.csr
- rw-r--r-- 1 root root 212 Sep 13 20 : 01 ca-csr.json
- rw------- 1 root root 1679 Sep 13 20 : 01 ca-key.pem
- rw-r--r-- 1 root root 1273 Sep 13 20 : 01 ca.pem
  1. 5 、 签发kube-apiserver证书

    1. 1 、 创建 kube-apiserver 证书签名配置
[root@kubernetes-master- 01 k 8 s]# cat > server-csr.json << EOF
{
"CN": "kubernetes",
"hosts": [
" 127. 0. 0. 1 ",
" 172. 16. 0. 50 ",
" 172. 16. 0. 51 ",
" 172. 16. 0. 52 ",
" 172. 16. 0. 55 ",
" 10. 96. 0. 1 ",
"kubernetes",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluster.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "ShangHai",
"ST": "ShangHai"
}
]
}
EOF

host:localhost地址 +master部署节点的ip地址+etcd节点的部署地址 +负载均衡指定的
VIP( 172. 16. 0. 55 )+serviceip段的第一个合法地址( 10. 96. 0. 1 )+k 8 s默认指定的一些地址。

6. 5. 2 、 生成证书

[root@kubernetes-master- 01 k 8 s]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem

- config=ca-config.json-profile=kubernetesserver-csr.json|cfssljson-bareserver
2020 / 08 / 29 12 : 29 : 41 [INFO] generate received request
2020 / 08 / 29 12 : 29 : 41 [INFO] received CSR
2020 / 08 / 29 12 : 29 : 41 [INFO] generating key: rsa- 2048
2020 / 08 / 29 12 : 29 : 41 [INFO] encoded CSR
2020 / 08 / 29 12 : 29 : 41 [INFO] signed certificate with serial number
701177072439793091180552568331885323625122463841
  1. 6 、 签发kube-controller-manager证书

    1. 1 、 创建 kube-controller-manager 证书签名配置
cat > kube-controller-manager-csr.json << EOF
{
"CN": "system:kube-controller-manager",
"hosts": [
" 127. 0. 0. 1 ",
" 172. 16. 0. 50 ",
" 172. 16. 0. 51 ",
" 172. 16. 0. 52 ",
" 172. 16. 0. 55 "
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "system:kube-controller-manager",
"OU": "System"
}
]
}

EOF

生成证书

[root@kubernetes-master- 01 k 8 s]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem

- config=ca-config.json -profile=kubernetes kube-controller-manager-csr.json |
cfssljson -bare kube-controller-manager
2020 / 08 / 29 12 : 40 : 21 [INFO] generate received request
2020 / 08 / 29 12 : 40 : 21 [INFO] received CSR
2020 / 08 / 29 12 : 40 : 21 [INFO] generating key: rsa- 2048
2020 / 08 / 29 12 : 40 : 22 [INFO] encoded CSR
2020 / 08 / 29 12 : 40 : 22 [INFO] signed certificate with serial number
464924254532468215049650676040995556458619239240
  1. 7 、 签发kube-scheduler证书

    1. 1 、 创建 kube-scheduler 签名配置
cat > kube-scheduler-csr.json << EOF
{
"CN": "system:kube-scheduler",
"hosts": [
" 127. 0. 0. 1 ",
" 172. 16. 0. 50 ",
" 172. 16. 0. 51 ",
" 172. 16. 0. 52 ",
" 172. 16. 0. 55 "
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "system:kube-scheduler",
"OU": "System"
}
]
}
EOF

6. 7. 2 、 创建证书

[root@kubernetes-master- 01 k 8 s]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem

- config=ca-config.json -profile=kubernetes kube-scheduler-csr.json | cfssljson
- bare kube-scheduler
2020 / 08 / 29 12 : 42 : 29 [INFO] generate received request
2020 / 08 / 29 12 : 42 : 29 [INFO] received CSR
2020 / 08 / 29 12 : 42 : 29 [INFO] generating key: rsa- 2048
2020 / 08 / 29 12 : 42 : 29 [INFO] encoded CSR
2020 / 08 / 29 12 : 42 : 29 [INFO] signed certificate with serial number
420546069405900774170348492061478728854870171400
  1. 8 、 签发kube-proxy证书

    1. 1 、 创建 kube-proxy 证书签名配置
cat > kube-proxy-csr.json << EOF
{
"CN":"system:kube-proxy",
"hosts":[],
"key":{
"algo":"rsa",
"size": 2048
},
"names":[
{
"C":"CN",
"L":"BeiJing",
"ST":"BeiJing",
"O":"system:kube-proxy",
"OU":"System"
}
]
}
EOF

6. 8. 2 、 生成证书

[root@kubernetes-master- 01 k 8 s]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem

- config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare
kube-proxy
2020 / 08 / 29 12 : 45 : 11 [INFO] generate received request
2020 / 08 / 29 12 : 45 : 11 [INFO] received CSR
2020 / 08 / 29 12 : 45 : 11 [INFO] generating key: rsa- 2048
2020 / 08 / 29 12 : 45 : 11 [INFO] encoded CSR
2020 / 08 / 29 12 : 45 : 11 [INFO] signed certificate with serial number
39717174368771783903269928946823692124470234079
2020 / 08 / 29 12 : 45 : 11 [WARNING]This certificatelacks a"hosts" field. Thismakes it
unsuitable for
websites. For more information see the Baseline Requirements for the Issuance and
Management
of Publicly-Trusted Certificates, v. 1. 1. 6 , from the CA/Browser Forum
(https://cabforum.org);
specifically, section 10. 2. 3 ("Information Requirements").

6. 9 、 签发管理员用户证书

## 为了能让集群客户端工具安全的访问集群,所以要为集群客户端创建证书,使其具有所有的集群权限。

6. 9. 1 、 创建证书签名配置

cat > admin-csr.json << EOF
{
"CN":"admin",
"key":{
"algo":"rsa",
"size": 2048
## },

"names":[
{
"C":"CN",
"L":"BeiJing",
"ST":"BeiJing",
"O":"system:masters",
"OU":"System"
}
]
}
EOF

6. 9. 2 、 生成证书

[root@kubernetes-master- 01 k 8 s]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem
- config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
2020 / 08 / 29 12 : 50 : 46 [INFO] generate received request
2020 / 08 / 29 12 : 50 : 46 [INFO] received CSR
2020 / 08 / 29 12 : 50 : 46 [INFO] generating key: rsa- 2048
2020 / 08 / 29 12 : 50 : 46 [INFO] encoded CSR
2020 / 08 / 29 12 : 50 : 46 [INFO] signed certificate with serial number
247283053743606613190381870364866954196747322330
2020 / 08 / 29 12 : 50 : 46 [WARNING]This certificatelacks a"hosts" field. Thismakes it
unsuitable for
websites. For more information see the Baseline Requirements for the Issuance and
Management
of Publicly-Trusted Certificates, v. 1. 1. 6 , from the CA/Browser Forum
(https://cabforum.org);
specifically, section 10. 2. 3 ("Information Requirements").

6. 10 、 颁发证书

Master节点所需证书:ca、kube-apiservver、kube-controller-manager、kube-scheduler、用户证书、Etcd
证书。
    1. 1 、颁发 Master 节点证书
mkdir -pv /etc/kubernetes/ssl

cp 
- p ./{ca*pem,server*pem,kube-controller-manager*pem,kube-scheduler*.pem,kube-prox
y*pem,admin*.pem} /etc/kubernetes/ssl

for i in kubernetes-master- 02 kubernetes-master- 03 ; do
ssh root@$i "mkdir -pv /etc/kubernetes/ssl"
scp /etc/kubernetes/ssl/* root@$i:/etc/kubernetes/ssl
done

[root@kubernetes-master- 01 k 8 s]#foriinkubernetes-master- 02 kubernetes-master- 03 ;
do
> ssh root@$i "mkdir -pv /etc/kubernetes/ssl"
> scp /etc/kubernetes/ssl/* root@$i:/etc/kubernetes/ssl
> done
mkdir: created directory ‘/etc/kubernetes/ssl’
admin-key.pem
100 % 1679 562. 2 KB/s 00 : 00
admin.pem
100 % 1359 67. 5 KB/s 00 : 00
ca-key.pem
100 % 1679 39. 5 KB/s 00 : 00
ca.pem
100 % 1273 335. 6 KB/s 00 : 00
kube-controller-manager-key.pem
100 % 1679 489. 6 KB/s 00 : 00
kube-controller-manager.pem
100 % 1472 69. 4 KB/s 00 : 00
kube-proxy-key.pem
100 % 1679 646. 6 KB/s 00 : 00
kube-proxy.pem
100 % 1379 672. 8 KB/s 00 : 00
kube-scheduler-key.pem
100 % 1679 472. 1 KB/s 00 : 00
kube-scheduler.pem
100 % 1448 82. 7 KB/s 00 : 00
server-key.pem
100 % 1675 898. 3 KB/s 00 : 00
server.pem
100 % 1554 2. 2 MB/s 00 : 00
mkdir: created directory ‘/etc/kubernetes/ssl’
admin-key.pem
100 % 1679 826. 3 KB/s 00 : 00
admin.pem
100 % 1359 1. 1 MB/s 00 : 00
ca-key.pem
100 % 1679 127. 4 KB/s 00 : 00
ca.pem
100 % 1273 50. 8 KB/s 00 : 00
kube-controller-manager-key.pem
100 % 1679 197. 7 KB/s 00 : 00
kube-controller-manager.pem
100 % 1472 833. 7 KB/s 00 : 00
kube-proxy-key.pem
100 % 1679 294. 6 KB/s 00 : 00
kube-proxy.pem
100 % 1379 94. 9 KB/s 00 : 00
kube-scheduler-key.pem
100 % 1679 411. 2 KB/s 00 : 00
kube-scheduler.pem
100 % 1448 430. 4 KB/s 00 : 00
server-key.pem
100 % 1675 924. 0 KB/s 00 : 00
server.pem
100 % 1554 126. 6 KB/s 00 : 00
  1. 11 、 部署master节点

6. 11. 1 、下载二进制组件

# 下载server安装包
wget https://dl.k 8 s.io/v 1. 18. 8 /kubernetes-server-linux-amd 64 .tar.gz

# 下载client安装包
wget https://dl.k 8 s.io/v 1. 18. 8 /kubernetes-client-linux-amd 64 .tar.gz

# 下载Node安装包
wget https://dl.k 8 s.io/v 1. 18. 8 /kubernetes-node-linux-amd 64 .tar.gz

[root@kubernetes-master- 01 ~]# ll

- rw-r--r-- 1 root root 13237066 8 月 29 02 : 51
kubernetes-client-linux-amd 64 .tar.gz
- rw-r--r-- 1 root root 97933232 8 月 29 02 : 51
kubernetes-node-linux-amd 64 .tar.gz
- rw-r--r-- 1 root root 363943527 8 月 29 02 : 51
kubernetes-server-linux-amd 64 .tar.gz

# 如果无法下载,可用下方方法
[root@kubernetes-master- 01 k 8 s]# docker pull
registry.cn-hangzhou.aliyuncs.com/k 8 sos/k 8 s:v 1. 18. 8. 1
v 1. 18. 8. 1 : Pulling from k 8 sos/k 8 s
75 f 829 a 71 a 1 c: Pull complete
183 ee 8383 f 81 : Pull complete
a 5955 b 997 bb 4 : Pull complete
5401 bb 259 bcd: Pull complete
0 c 05 c 4 d 60 f 48 : Pull complete
6 a 216 d 9 c 9 d 7 c: Pull complete
6711 ab 2 c 0 ba 7 : Pull complete
3 ff 1975 ab 201 : Pull complete
Digest: sha 256 :ee 02569 b 218 a 4 bab 3 f 64 a 7 be 0 b 23 a 9 feda 8 c 6717 e 03 f 30 da 83 f 80387 aa 46 e 202
Status: Downloaded newer image for
registry.cn-hangzhou.aliyuncs.com/k 8 sos/k 8 s:v 1. 18. 8. 1
registry.cn-hangzhou.aliyuncs.com/k 8 sos/k 8 s:v 1. 18. 8. 1
# 紧接着在容器当中复制出来即可。

6. 11. 2 、分发组件

[root@kubernetes-master- 01 bin]#foriinkubernetes-master- 01 kubernetes-master- 02
kubernetes-master- 03 ; do scp kube-apiserver kube-controller-manager
kube-scheduler kubectl root@$i:/usr/local/bin/; done
kube-apiserver 100 % 115 MB 94. 7 MB/s 00 : 01
kube-controller-manager 100 % 105 MB 87. 8 MB/s 00 : 01
kube-scheduler 100 % 41 MB 88. 2 MB/s 00 : 00
kubectl 100 % 42 MB 95. 7 MB/s 00 : 00
kube-apiserver 100 % 115 MB 118. 4 MB/s 00 : 00
kube-controller-manager 100 % 105 MB 107. 3 MB/s 00 : 00
kube-scheduler 100 % 41 MB 119. 9 MB/s 00 : 00
kubectl 100 % 42 MB 86. 0 MB/s 00 : 00
kube-apiserver 100 % 115 MB 120. 2 MB/s 00 : 00
kube-controller-manager 100 % 105 MB 108. 1 MB/s 00 : 00
kube-scheduler 100 % 41 MB 102. 4 MB/s 00 : 00
kubectl 100 % 42 MB 124. 3 MB/s 00 : 00

6. 11. 3 、创建集群配置文件

在kubernetes中,我们需要创建一个配置文件,用来配置集群、用户、命名空间及身份认证等信息。
      1. 1 、 创建kube-controller-manager.kubeconfig文件
export KUBE_APISERVER="https:// 172. 16. 0. 55 : 8443 "

# 设置集群参数
kubectl config set-cluster kubernetes \

- -certificate-authority=/etc/kubernetes/ssl/ca.pem \
- -embed-certs=true \
- -server=${KUBE_APISERVER} \
- -kubeconfig=kube-controller-manager.kubeconfig

## # 设置客户端认证参数

kubectl config set-credentials "kube-controller-manager" \

- -client-certificate=/etc/kubernetes/ssl/kube-controller-manager.pem \
- -client-key=/etc/kubernetes/ssl/kube-controller-manager-key.pem \
- -embed-certs=true \
- -kubeconfig=kube-controller-manager.kubeconfig

# 设置上下文参数(在上下文参数中将集群参数和用户参数关联起来)

kubectl config set-context default \
- -cluster=kubernetes \
- -user="kube-controller-manager" \
- -kubeconfig=kube-controller-manager.kubeconfig

# 配置默认上下文
kubectlconfiguse-contextdefault--kubeconfig=kube-controller-manager.kubeconfig

6. 11. 3. 1. 1 、参数详解

1. --certificate-authority:验证 kube-apiserver 证书的根证书。
2. --client-certificate、--client-key:刚生成的kube-controller-manager证书和私钥,连接 kube-apiserver时
使用。
3. --embed-certs=true:将ca.pem和kube-controller-manager 证书内容嵌入到生成的 kubectl.kubeconfig
文件中(不加时,写入的是证书文件路径)。

6. 11. 3. 2 、 **创建kube-scheduler.kubeconfig文件**

```bash
export KUBE_APISERVER="https:// 172. 16. 0. 55 : 8443 "

## # 设置集群参数

kubectl config set-cluster kubernetes \

- -certificate-authority=/etc/kubernetes/ssl/ca.pem \
- -embed-certs=true \
- -server=${KUBE_APISERVER} \
- -kubeconfig=kube-scheduler.kubeconfig

# 设置客户端认证参数
kubectl config set-credentials "kube-scheduler" \

- -client-certificate=/etc/kubernetes/ssl/kube-scheduler.pem \
- -client-key=/etc/kubernetes/ssl/kube-scheduler-key.pem \
- -embed-certs=true \
- -kubeconfig=kube-scheduler.kubeconfig

## # 设置上下文参数(在上下文参数中将集群参数和用户参数关联起来)

kubectl config set-context default \

- -cluster=kubernetes \
- -user="kube-scheduler" \
- -kubeconfig=kube-scheduler.kubeconfig

## # 配置默认上下文

kubectl config use-context default --kubeconfig=kube-scheduler.kubeconfig
      1. 3 、 创建kube-proxy.kubeconfig文件
export KUBE_APISERVER="https:// 172. 16. 0. 55 : 8443 "

# 设置集群参数
kubectl config set-cluster kubernetes \

- -certificate-authority=/etc/kubernetes/ssl/ca.pem \
- -embed-certs=true \
- -server=${KUBE_APISERVER} \
- -kubeconfig=kube-proxy.kubeconfig

# 设置客户端认证参数
kubectl config set-credentials "kube-proxy" \

- -client-certificate=/etc/kubernetes/ssl/kube-proxy.pem \
- -client-key=/etc/kubernetes/ssl/kube-proxy-key.pem \
- -embed-certs=true \
- -kubeconfig=kube-proxy.kubeconfig

# 设置上下文参数(在上下文参数中将集群参数和用户参数关联起来)
kubectl config set-context default \

- -cluster=kubernetes \
- -user="kube-proxy" \
- -kubeconfig=kube-proxy.kubeconfig

# 配置默认上下文
kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
···
6. 11. 3. 4 、 **创建admin.kubeconfig文件**

```bash
export KUBE_APISERVER="https:// 172. 16. 0. 55 : 8443 "

## # 设置集群参数

kubectl config set-cluster kubernetes \

- -certificate-authority=/etc/kubernetes/ssl/ca.pem \
- -embed-certs=true \
- -server=${KUBE_APISERVER} \
- -kubeconfig=admin.kubeconfig

# 设置客户端认证参数
kubectl config set-credentials "admin" \

- -client-certificate=/etc/kubernetes/ssl/admin.pem \
- -client-key=/etc/kubernetes/ssl/admin-key.pem \
- -embed-certs=true \
- -kubeconfig=admin.kubeconfig

# 设置上下文参数(在上下文参数中将集群参数和用户参数关联起来)
kubectl config set-context default \

- -cluster=kubernetes \
- -user="admin" \
- -kubeconfig=admin.kubeconfig

# 配置默认上下文
kubectl config use-context default --kubeconfig=admin.kubeconfig

6. 11. 4 、分发集群配置文件

[root@kubernetes-master- 01 ~]# for i in kubernetes-master- 01 kubernetes-master- 02
kubernetes-master- 03 ;
do
ssh root@$i "mkdir -p /etc/kubernetes/cfg";
scp token.csv kube-scheduler.kubeconfig kube-controller-manager.kubeconfig
admin.kubeconfig kube-proxy.kubeconfig kubelet-bootstrap.kubeconfig
root@$i:/etc/kubernetes/cfg;
done

token.csv 100 % 84 662. 0 KB/s 00 : 00
kube-scheduler.kubeconfig 100 % 6159 47. 1 MB/s 00 : 00
kube-controller-manager.kubeconfig 100 % 6209 49. 4 MB/s
00 : 00
admin.conf 100 % 6021 51. 0 MB/s 00 : 00
kube-proxy.kubeconfig 100 % 6059 52. 7 MB/s 00 : 00
kubelet-bootstrap.kubeconfig 100 % 1985 25. 0 MB/s
00 : 00
token.csv 100 % 84 350. 5 KB/s 00 : 00
kube-scheduler.kubeconfig 100 % 6159 20. 0 MB/s 00 : 00
kube-controller-manager.kubeconfig 100 % 6209 20. 7 MB/s
00 : 00
admin.conf 100 % 6021 23. 4 MB/s 00 : 00
kube-proxy.kubeconfig 100 % 6059 20. 0 MB/s 00 : 00
kubelet-bootstrap.kubeconfig 100 % 1985 4. 4 MB/s 00 : 00
token.csv 100 % 84 411. 0 KB/s 00 : 00
kube-scheduler.kubeconfig 100 % 6159 19. 6 MB/s 00 : 00
kube-controller-manager.kubeconfig 100 % 6209 21. 4 MB/s
00 : 00
admin.conf 100 % 6021 19. 9 MB/s 00 : 00
kube-proxy.kubeconfig 100 % 6059 20. 1 MB/s 00 : 00
kubelet-bootstrap.kubeconfig 100 % 1985 9. 8 MB/s 00 : 00

6. 11. 5 、部署组件

      1. 1 、 部署api-server
创建kube-apiserver服务配置文件(三个节点都要执行,不能复制,注意apiserverIP)。
KUBE_APISERVER_IP=`hostname -i`

cat > /etc/kubernetes/cfg/kube-apiserver.conf << EOF
KUBE_APISERVER_OPTS="--logtostderr=false \\

- -v= 2 \\
- -log-dir=/var/log/kubernetes \\
- -advertise-address=${KUBE_APISERVER_IP} \\
- -default-not-ready-toleration-seconds= 360 \\
- -default-unreachable-toleration-seconds= 360 \\
- -max-mutating-requests-inflight= 2000 \\
- -max-requests-inflight= 4000 \\
- -default-watch-cache-size= 200 \\
- -delete-collection-workers= 2 \\
- -bind-address= 0. 0. 0. 0 \\
- -secure-port= 6443 \\
- -allow-privileged=true \\
- -service-cluster-ip-range= 10. 96. 0. 0 / 16 \\
- -service-node-port-range= 10 - 52767 \\
- -enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,Resourc
eQuota,NodeRestriction \\
- -authorization-mode=RBAC,Node \\
- -enable-bootstrap-token-auth=true \\
- -token-auth-file=/etc/kubernetes/cfg/token.csv \\
- -kubelet-client-certificate=/etc/kubernetes/ssl/server.pem \\
- -kubelet-client-key=/etc/kubernetes/ssl/server-key.pem \\
- -tls-cert-file=/etc/kubernetes/ssl/server.pem \\
- -tls-private-key-file=/etc/kubernetes/ssl/server-key.pem \\
- -client-ca-file=/etc/kubernetes/ssl/ca.pem \\
- -service-account-key-file=/etc/kubernetes/ssl/ca-key.pem \\
- -audit-log-maxage= 30 \\
- -audit-log-maxbackup= 3 \\
- -audit-log-maxsize= 100 \\
- -audit-log-path=/var/log/kubernetes/k 8 s-audit.log \\
- -etcd-servers=https:// 172. 16. 0. 50 : 2379 ,https:// 172. 16. 0. 51 : 2379 ,https:// 172. 16.
0. 52 : 2379 \\
- -etcd-cafile=/etc/etcd/ssl/ca.pem \\
- -etcd-certfile=/etc/etcd/ssl/etcd.pem \\
- -etcd-keyfile=/etc/etcd/ssl/etcd-key.pem"
EOF

6. 11. 5. 1. 1 、参数详解

## 配置选项 选项说明

- -logtostderr=false 输出日志到文件中,不输出到标准错误控制台
- -v= 2 指定输出日志的级别
- -advertise-address 向集群成员通知 apiserver消息的 IP地址
- -etcd-servers 连接的 etcd服务器列表
- -etcd-cafile 用于etcd通信的 SSLCA文件
- -etcd-certfile 用于 etcd 通信的的 SSL证书文件
- -etcd-keyfile 用于 etcd 通信的SSL密钥文件
- -service-cluster-ip-range Service网络地址分配
- -bind-address
    监听 --seure-port 的 IP 地址,如果为空,则将使用所有接口
    ( 0. 0. 0. 0 )
- -secure-port= 6443

## 用于监听具有认证授权功能的 HTTPS协议的端口,默认值是

## 6443

- -allow-privileged 是否启用授权功能
- -service-node-port-range Service使用的端口范围
- -default-not-ready-toleration-seconds 表示 notReady状态的容忍度秒数
- -default-unreachable-toleration-seconds 表示 unreachable状态的容忍度秒数:
- -max-mutating-requests-inflight= 2000

## 在给定时间内进行中可变请求的最大数量, 0 值表示没有限制(默

## 认值 200 )

- -default-watch-cache-size= 200

## 默认监视缓存大小, 0 表示对于没有设置默认监视大小的资源,将

## 禁用监视缓存

- -delete-collection-workers= 2

用于 DeleteCollection 调用的工作者数量,这被用于加速
namespace的清理(默认值 1 )

- -enable-admission-plugins 资源限制的相关配置
- -authorization-mode

## 在安全端口上进行权限验证的插件的顺序列表,以逗号分隔的列

## 表。
        1. 2 、注册 kube-apiserver 服务
cat > /usr/lib/systemd/system/kube-apiserver.service << EOF
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes
After=network.target

[Service]
EnvironmentFile=/etc/kubernetes/cfg/kube-apiserver.conf
ExecStart=/usr/local/bin/kube-apiserver \$KUBE_APISERVER_OPTS
Restart=on-failure
RestartSec= 10
Type=notify

LimitNOFILE= 65536

[Install]
WantedBy=multi-user.target
EOF
        1. 3 、分发 kube-apiserver 服务脚本
for i in kubernetes-master- 02 kubernetes-master- 03 ;
do
scp /usr/lib/systemd/system/kube-apiserver.service
root@$i:/usr/lib/systemd/system/kube-apiserver.service
done

6. 11. 5. 1. 4 、启动

# 创建kubernetes日志目录
mkdir -p /var/log/kubernetes/
systemctl daemon-reload
systemctl enable --now kube-apiserver
      1. 2 、 高可用部署api-server
负载均衡器有很多种,只要能实现api-server高可用都行,这里我们采用官方推荐的haproxy+keepalived。
        1. 1 、安装高可用软件
yum install -y keepalived haproxy
        1. 2 、配置 haproxy 服务
cat > /etc/haproxy/haproxy.cfg <<EOF
global
maxconn 2000
ulimit-n 16384
log 127. 0. 0. 1 local 0 err
stats timeout 30 s

defaults
log global
mode http
option httplog
timeout connect 5000
timeout client 50000
timeout server 50000
timeout http-request 15 s
timeout http-keep-alive 15 s

frontend monitor-in
bind *: 33305
mode http
option httplog
monitor-uri /monitor

listen stats
bind *: 8006
mode http
stats enable
stats hide-version
stats uri /stats
stats refresh 30 s
stats realm Haproxy\ Statistics
stats auth admin:admin

frontend k 8 s-master
bind 0. 0. 0. 0 : 8443
bind 127. 0. 0. 1 : 8443
mode tcp
option tcplog
tcp-request inspect-delay 5 s
default_backend k 8 s-master
backend k 8 s-master
mode tcp
option tcplog
option tcp-check
balance roundrobin
default-serverinter 10 sdowninter 5 srise 2 fall 2 slowstart 60 smaxconn 250 maxqueue
256 weight 100
server kubernetes-master- 01 172. 16. 0. 50 : 6443 check inter 2000 fall 2 rise 2
weight 100
server kubernetes-master- 02 172. 16. 0. 51 : 6443 check inter 2000 fall 2 rise 2
weight 100
server kubernetes-master- 03 172. 16. 0. 52 : 6443 check inter 2000 fall 2 rise 2
weight 100
EOF

6. 11. 5. 2. 3 、分发至其他节点

for i in kubernetes-master- 01 kubernetes-master- 02 kubernetes-master- 03 ;
do
ssh root@$i "mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg_bak"
scp haproxy.cfg root@$i:/etc/haproxy/haproxy.cfg
done
        1. 4 、 haproxy 常见链接错误
# 打开链接策略
setsebool -P haproxy_connect_any= 1
        1. 5 、配置 keepalived 服务
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf_bak

cd /etc/keepalived

cat > /etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_script chk_kubernetes {
script "/etc/keepalived/check_kubernetes.sh"
interval 2
weight - 5
fall 3
rise 2
}
vrrp_instance VI_ 1 {
state MASTER
interface eth 0
mcast_src_ip 172. 16. 0. 50
virtual_router_id 51
priority 100
advert_int 2
authentication {
auth_type PASS
auth_pass K 8 SHA_KA_AUTH
}
virtual_ipaddress {
172. 16. 0. 55
}
# track_script {
# chk_kubernetes
# }
}
EOF
        1. 6 、分发 keepalived 配置文件
for i in kubernetes-master- 02 kubernetes-master- 03 ;
do
ssh root@$i "mv /etc/keepalived/keepalived.conf
/etc/keepalived/keepalived.conf_bak"
scp /etc/keepalived/keepalived.conf root@$i:/etc/keepalived/keepalived.conf
done
          1. 1 、配置kubernetes-master- 02 节点
sed -i 's#state MASTER#state BACKUP#g' /etc/keepalived/keepalived.conf
sed -i 's# 172. 16. 0. 50 # 172. 16. 0. 51 #g' /etc/keepalived/keepalived.conf
sed -i 's#priority 100 #priority 90 #g' /etc/keepalived/keepalived.conf
          1. 2 、配置kubernetes-master- 03 节点
sed -i 's#state MASTER#state BACKUP#g' /etc/keepalived/keepalived.conf
sed -i 's# 172. 16. 0. 50 # 172. 16. 0. 52 #g' /etc/keepalived/keepalived.conf
sed -i 's#priority 100 #priority 98 #g' /etc/keepalived/keepalived.conf

6. 11. 5. 2. 6. 3 、设置监控检查脚本

cat > /etc/keepalived/check_kubernetes.sh <<EOF
#!/bin/bash

function chech_kubernetes() {
for ((i= 0 ;i< 5 ;i++));do
apiserver_pid_id=$(pgrep kube-apiserver)
if [[! -z $apiserver_pid_id ]];then
return
else
sleep 2
fi
apiserver_pid_id= 0
done
}

# 1 :running 0 :stopped
check_kubernetes
if [[ $apiserver_pid_id -eq 0 ]];then
/usr/bin/systemctl stop keepalived
exit 1
else
exit 0
fi
EOF

chmod +x /etc/keepalived/check_kubernetes.sh

6. 11. 5. 2. 6. 4 、启动keeplived和haproxy服务

systemctl enable --now keepalived haproxy

      1. 3 、 配置TLSbootstrapping

TLSbootstrapping是用来简化管理员配置kubelet 与apiserver 双向加密通信的配置步骤的一种机制。当
集群开启了TLS认证后,每个节点的 kubelet组件都要使用由 apiserver使用的CA签发的有效证书才能与
apiserver 通讯,此时如果有很多个节点都需要单独签署证书那将变得非常繁琐且极易出错,导致集群不稳。

TLSbootstrapping 功能就是让 node节点上的kubelet组件先使用一个预定的低权限用户连接到
apiserver,然后向 apiserver 申请证书,由 apiserver动态签署颁发到Node节点,实现证书签署自动化。

        1. 1 、生成 TLSbootstrapping 所需 token
# 必须要用自己机器创建的Token
TLS_BOOTSTRAPPING_TOKEN=`head -c 16 /dev/urandom | od -An -t x | tr -d ' '`

cat > token.csv << EOF
${TLS_BOOTSTRAPPING_TOKEN},kubelet-bootstrap, 10001 ,"system:kubelet-bootstrap"
EOF

[root@kubernetes-master- 01 k 8 s]# TLS_BOOTSTRAPPING_TOKEN=`head -c 16 /dev/urandom
| od -An -t x | tr -d ' '`
[root@kubernetes-master- 01 k 8 s]#
[root@kubernetes-master- 01 k 8 s]# cat > token.csv << EOF
> ${TLS_BOOTSTRAPPING_TOKEN},kubelet-bootstrap, 10001 ,"system:kubelet-bootstrap"
> EOF
[root@kubernetes-master- 01 k 8 s]# cat token.csv
1 b 076 dcc 88 e 04 d 64 c 3 a 9 e 7 d 7 a 1586 fe 5 ,kubelet-bootstrap, 10001 ,"system:kubelet-bootstr
ap"
        1. 2 、创建 TLSBootstrapping 集群配置文件
在kubernetes中,我们需要创建一个配置文件,用来配置集群、用户、命名空间及身份认证等信息。

export KUBE_APISERVER="https:// 172. 16. 0. 55 : 8443 "

# 设置集群参数
kubectl config set-cluster kubernetes \

- -certificate-authority=/etc/kubernetes/ssl/ca.pem \
- -embed-certs=true \
- -server=${KUBE_APISERVER} \
- -kubeconfig=kubelet-bootstrap.kubeconfig

# 设置客户端认证参数,此处token必须用上叙token.csv中的token
kubectl config set-credentials "kubelet-bootstrap" \

- -token= 3 ac 791 ff 0 afab 20 f 5324 ff 898 bb 1570 e \
- -kubeconfig=kubelet-bootstrap.kubeconfig

# 设置上下文参数(在上下文参数中将集群参数和用户参数关联起来)
kubectl config set-context default \

- -cluster=kubernetes \
- -user="kubelet-bootstrap" \
- -kubeconfig=kubelet-bootstrap.kubeconfig

# 配置默认上下文
kubectl config use-context default --kubeconfig=kubelet-bootstrap.kubeconfig
        1. 3 、分发 TLSbootstrap 证书
for i in kubernetes-master- 01 kubernetes-master- 02 kubernetes-master- 03 ;
do
ssh root@$i "mkdir -p /etc/kubernetes/cfg";
scp token.csv kube-scheduler.kubeconfig kube-controller-manager.kubeconfig
admin.kubeconfig kube-proxy.kubeconfig kubelet-bootstrap.kubeconfig
root@$i:/etc/kubernetes/cfg;
done
        1. 4 、授权 TLSBootrapping 用户请求
kubectl create clusterrolebinding kubelet-bootstrap \

- -clusterrole=system:node-bootstrapper \
- -user=kubelet-bootstrap
      1. 4 、 部署kube-controller-manager服务

ControllerManager作为集群内部的管理控制中心,负责集群内的Node、Pod副本、服务端点(Endpoint)、
命名空间(Namespace)、服务账号(ServiceAccount)、资源定额(ResourceQuota)的管理,当某个Node
意外宕机时,ControllerManager会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态。如果
多个控制器管理器同时生效,则会有一致性问题,所以kube-controller-manager的高可用,只能是主备模式,
而kubernetes集群是采用租赁锁实现leader选举,需要在启动参数中加入--leader-elect=true。

        1. 1 、创建 kube-controller-manager 配置文件
cat > /etc/kubernetes/cfg/kube-controller-manager.conf << EOF
KUBE_CONTROLLER_MANAGER_OPTS="--logtostderr=false \\
- -v= 2 \\
- -log-dir=/var/log/kubernetes \\
- -leader-elect=true \\
- -cluster-name=kubernetes \\
- -bind-address= 127. 0. 0. 1 \\
- -allocate-node-cidrs=true \\
- -cluster-cidr= 10. 244. 0. 0 / 12 \\
- -service-cluster-ip-range= 10. 96. 0. 0 / 16 \\
- -cluster-signing-cert-file=/etc/kubernetes/ssl/ca.pem \\
- -cluster-signing-key-file=/etc/kubernetes/ssl/ca-key.pem \\
- -root-ca-file=/etc/kubernetes/ssl/ca.pem \\
- -service-account-private-key-file=/etc/kubernetes/ssl/ca-key.pem \\
- -kubeconfig=/etc/kubernetes/cfg/kube-controller-manager.kubeconfig \\
- -tls-cert-file=/etc/kubernetes/ssl/kube-controller-manager.pem \\
- -tls-private-key-file=/etc/kubernetes/ssl/kube-controller-manager-key.pem \\
- -experimental-cluster-signing-duration= 87600 h 0 m 0 s \\
- -controllers=*,bootstrapsigner,tokencleaner \\
- -use-service-account-credentials=true \\
- -node-monitor-grace-period= 10 s \\
- -horizontal-pod-autoscaler-use-rest-clients=true"

6. 11. 5. 4. 2 、配置文件详解

## 配置选项 选项意义

- -leader-elect 高可用时启用选举功能。
- -master 通过本地非安全本地端口^8080 连接apiserver
- -bind-address 监控地址
- -allocate-node-cidrs 是否应在node节点上分配和设置Pod的CIDR
- -cluster-cidr

ControllerManager在启动时如果设置了--cluster-cidr
参数,防止不同的节点的CIDR地址发生冲突

- -service-cluster-ip-range 集群Services 的CIDR范围
- -cluster-signing-cert-file

## 指定用于集群签发的所有集群范围内证书文件(根证书

## 文件)

- -cluster-signing-key-file 指定集群签发证书的key
- -root-ca-file
    如果设置,该根证书权限将包含serviceacount的toker
    secret,这必须是一个有效的PEM编码CA包
- -service-account-private-key-file

包含用于签署serviceaccounttoken的PEM编码RSA
或者ECDSA私钥的文件名

- -experimental-cluster-signing-duration 证书签发时间
        1. 3 、注册 kube-controller-manager 服务
cat > /usr/lib/systemd/system/kube-controller-manager.service << EOF
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/kubernetes/kubernetes
After=network.target

[Service]
EnvironmentFile=/etc/kubernetes/cfg/kube-controller-manager.conf
ExecStart=/usr/local/bin/kube-controller-manager \$KUBE_CONTROLLER_MANAGER_OPTS
Restart=on-failure
RestartSec= 5

[Install]
WantedBy=multi-user.target
EOF

6. 11. 5. 4. 4 、分发脚本

for i in kubernetes-master- 02 kubernetes-master- 03 ;
do
scp/etc/kubernetes/cfg/kube-controller-manager.confroot@$i:/etc/kubernetes/cfg
scp /usr/lib/systemd/system/kube-controller-manager.service
root@$i:/usr/lib/systemd/system/kube-controller-manager.service
done

6. 11. 5. 4. 5 、启动

# 分别在三个master节点上启动
[root@kubernetes-master- 01 ~]# systemctl daemon-reload
[root@kubernetes-master- 01 ~]# systemctl enable --now kube-controller-manager
[root@kubernetes-master- 01 ~]# systemctl status kube-controller-manager
● kube-controller-manager.service - Kubernetes Controller Manager
Loaded:loaded(/usr/lib/systemd/system/kube-controller-manager.service;enabled;
vendor preset: disabled)
Active: active (running) since一 2020 - 11 - 16 14 : 55 : 46 CST; 1 weeks 3 days ago
Docs: https://github.com/kubernetes/kubernetes
Main PID: 3854 (kube-controller)
CGroup: /system.slice/kube-controller-manager.service
└─ 3854 /usr/local/bin/kube-controller-manager--logtostderr=false--v= 2

- -log-dir=/var/log/kubernetes --leader-elect=true --cluster-name=kubernetes
- -bind-address= 127. 0. 0. 1 - -allocate-node...

11 月 16 15 : 09 : 40 kubernetes-master- 01 kube-controller-manager[ 3854 ]: E 1116
15 : 09 : 40. 495403 3854 leaderelection.go: 320 ] error retrieving resource lock
kube-system/kube-controller-manage...ion refused
11 月 16 15 : 09 : 44 kubernetes-master- 01 kube-controller-manager[ 3854 ]: E 1116
15 : 09 : 44. 027037 3854 leaderelection.go: 320 ] error retrieving resource lock
kube-system/kube-controller-manage...ion refused
11 月 16 15 : 09 : 46 kubernetes-master- 01 kube-controller-manager[ 3854 ]: E 1116
15 : 09 : 46. 932321 3854 leaderelection.go: 320 ] error retrieving resource lock
kube-system/kube-controller-manage...ion refused
11 月 16 15 : 09 : 50 kubernetes-master- 01 kube-controller-manager[ 3854 ]: E 1116
15 : 09 : 50. 454578 3854 leaderelection.go: 320 ] error retrieving resource lock
kube-system/kube-controller-manage...ion refused
11 月 16 15 : 09 : 52 kubernetes-master- 01 kube-controller-manager[ 3854 ]: E 1116
15 : 09 : 52. 989980 3854 leaderelection.go: 320 ] error retrieving resource lock
kube-system/kube-controller-manage...ion refused
11 月 16 15 : 09 : 57 kubernetes-master- 01 kube-controller-manager[ 3854 ]: E 1116
15 : 09 : 57. 045952 3854 leaderelection.go: 320 ] error retrieving resource lock
kube-system/kube-controller-manage...ion refused
11 月 16 15 : 10 : 01 kubernetes-master- 01 kube-controller-manager[ 3854 ]: E 1116
15 : 10 : 01. 147034 3854 leaderelection.go: 320 ] error retrieving resource lock
kube-system/kube-controller-manage...ion refused
11 月 16 15 : 10 : 05 kubernetes-master- 01 kube-controller-manager[ 3854 ]: E 1116
15 : 10 : 05. 294025 3854 core.go: 89 ]Failedtostart servicecontroller: WARNING: no
cloud provider provided, ser...r will fail
11 月 16 15 : 10 : 08 kubernetes-master- 01 kube-controller-manager[ 3854 ]: E 1116
15 : 10 : 08. 901810 3854 core.go: 229 ]failedtostartcloudnodelifecyclecontroller:
no cloud provider provided
11 月 17 14 : 34 : 50 kubernetes-master- 01 kube-controller-manager[ 3854 ]: E 1117
14 : 34 : 50. 107439 3854 tokens_controller.go: 261 ] error synchronizing
serviceaccount ingress-nginx/default: secr... terminated
Hint: Some lines were ellipsized, use -l to show in full.
      1. 5 、 部署kube-scheduler服务

kube-scheduler是Kubernetes 集群的默认调度器,并且是集群 控制面 的一部分。对每一个新创建的Pod
或者是未被调度的 Pod,kube-scheduler 会过滤所有的node,然后选择一个最优的 Node去运行这个 Pod。
kube-scheduler 调度器是一个策略丰富、拓扑感知、工作负载特定的功能,调度器显著影响可用性、性能和容
量。调度器需要考虑个人和集体的资源要求、服务质量要求、硬件/软件/政策约束、亲和力和反亲和力规范、数
据局部性、负载间干扰、完成期限等。工作负载特定的要求必要时将通过 API暴露。

        1. 1 、创建 kube-scheduler 配置文件
cat > /etc/kubernetes/cfg/kube-scheduler.conf << EOF
KUBE_SCHEDULER_OPTS="--logtostderr=false \\
- -v= 2 \\
- -log-dir=/var/log/kubernetes \\
- -kubeconfig=/etc/kubernetes/cfg/kube-scheduler.kubeconfig \\
- -leader-elect=true \\
- -master=http:// 127. 0. 0. 1 : 8080 \\
- -bind-address= 127. 0. 0. 1 "
EOF

6. 11. 5. 5. 2 、创建启动脚本

cat > /usr/lib/systemd/system/kube-scheduler.service << EOF
[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/kubernetes/kubernetes
After=network.target

[Service]
EnvironmentFile=/etc/kubernetes/cfg/kube-scheduler.conf
ExecStart=/usr/local/bin/kube-scheduler \$KUBE_SCHEDULER_OPTS
Restart=on-failure
RestartSec= 5

[Install]
WantedBy=multi-user.target
EOF

6. 11. 5. 5. 3 、分发配置文件

for ip in kubernetes-master- 02 kubernetes-master- 03 ;
do
scp /usr/lib/systemd/system/kube-scheduler.service
root@${ip}:/usr/lib/systemd/system
scp /etc/kubernetes/cfg/kube-scheduler.conf root@${ip}:/etc/kubernetes/cfg
done

6. 11. 5. 5. 4 、启动

# 分别在三台master节点上启动
systemctl daemon-reload
systemctl enable --now kube-scheduler

6. 11. 5. 6 、 查看集群状态

至此,master所有节点均安装完毕。现在我们要检验集群安装是否成功。
[root@kubernetes-master- 01 ~]# kubectl get cs
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd- 0 Healthy {"health":"true"}
etcd- 1 Healthy {"health":"true"}
etcd- 2 Healthy {"health":"true"}
      1. 7 、 部署kubelet服务
        1. 1 、创建 kubelet 配置
KUBE_HOSTNAME=`hostname`

cat > /etc/kubernetes/cfg/kubelet.conf << EOF
KUBELET_OPTS="--logtostderr=false \\

- -v= 2 \\
- -log-dir=/var/log/kubernetes \\
- -hostname-override=${KUBE_HOSTNAME} \\
- -container-runtime=docker \\
- -kubeconfig=/etc/kubernetes/cfg/kubelet.kubeconfig \\
- -bootstrap-kubeconfig=/etc/kubernetes/cfg/kubelet-bootstrap.kubeconfig \\
- -config=/etc/kubernetes/cfg/kubelet-config.yml \\
- -cert-dir=/etc/kubernetes/ssl \\
- -image-pull-progress-deadline= 15 m \\
- -pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/k 8 sos/pause: 3. 2 "
EOF

6. 11. 5. 7. 1. 1 、配置详解

## 配置选项 选项意义

- -hostname-override

用来配置该节点在集群中显示的主机名,kubelet 设置了

- –hostname-override参数后,kube-proxy也需要设置,否则会出现
找不到Node的情况
- -container-runtime 指定容器运行时引擎
- -kubeconfig kubelet作为客户端使用的kubeconfig认证文件,此文件是由
kube-controller-mananger自动生成的
  • -bootstrap-kubeconfig 指定令牌认证文件
  • -config 指定kubelet配置文件
  • -cert-dir 设置kube-controller-manager生成证书和私钥的目录
  • -image-pull-progress-deadline

镜像拉取进度最大时间,如果在这段时间拉取镜像没有任何进展,将

取消拉取,默认: 1 m 0 s
  • -pod-infra-container-image 每个pod中的network/ipc名称空间容器将使用的镜像
6. 11. 5. 7. 2 、创建 **kubelet-config** 配置文件
```bash
cat > /etc/kubernetes/cfg/kubelet-config.yml << EOF
kind: KubeletConfiguration
apiVersion: kubelet.config.k 8 s.io/v 1 beta 1
address: 172. 16. 0. 50
port: 10250
readOnlyPort: 10255
cgroupDriver: cgroupfs
clusterDNS:
- 10. 96. 0. 2
clusterDomain: cluster.local
failSwapOn: false
authentication:
    anonymous:
       enabled: false
    webhook:
       cacheTTL: 2 m 0 s
       enabled: true
    x 509 :
       clientCAFile: /etc/kubernetes/ssl/ca.pem
authorization:
    mode: Webhook
    webhook:
       cacheAuthorizedTTL: 5 m 0 s
       cacheUnauthorizedTTL: 30 s
evictionHard:
    imagefs.available: 15 %
    memory.available: 100 Mi
    nodefs.available: 10 %
    nodefs.inodesFree: 5 %
maxOpenFiles: 1000000
maxPods: 110
EOF

6. 11. 5. 7. 2. 1 、配置详解

## 配置选项 选项意义

address kubelet 服务监听的地址
port kubelet 服务的端口,默认^10250

readOnlyPort

没有认证/授权的只读 kubelet 服务端口 ,设置为 0
表示禁用,默认 10255
clusterDNS DNS服务器的IP地址列表

clusterDomain

集群域名,kubelet 将配置所有容器除了主机搜索域还
将搜索当前域
        1. 3 、创建 kubelet 启动脚本
cat > /usr/lib/systemd/system/kubelet.service << EOF
[Unit]
Description=Kubernetes Kubelet
After=docker.service

[Service]
EnvironmentFile=/etc/kubernetes/cfg/kubelet.conf
ExecStart=/usr/local/bin/kubelet \$KUBELET_OPTS
Restart=on-failure
RestartSec= 10
LimitNOFILE= 65536

[Install]
WantedBy=multi-user.target
EOF

6. 11. 5. 7. 4 、分发配置文件

for ip in kubernetes-master- 01 kubernetes-master- 02 kubernetes-master- 03 ;do
scp /etc/kubernetes/cfg/{kubelet-config.yml,kubelet.conf}
root@${ip}:/etc/kubernetes/cfg
scp /usr/lib/systemd/system/kubelet.service root@${ip}:/usr/lib/systemd/system
done

6. 11. 5. 7. 5 、配置文件处理

# 修改kubernetes-master- 02 配置
sed -i 's#master- 01 #master- 02 #g' /etc/kubernetes/cfg/kubelet.conf
sed -i 's# 172. 16. 0. 50 # 172. 16. 0. 51 #g' /etc/kubernetes/cfg/kubelet-config.yml

# 修改kubernetes-master- 03 配置
sed -i 's#master- 01 #master- 03 #g' /etc/kubernetes/cfg/kubelet.conf
sed -i 's# 172. 16. 0. 50 # 172. 16. 0. 52 #g' /etc/kubernetes/cfg/kubelet-config.yml
        1. 6 、分发 kubelet
[root@kubernetes-master- 01 bin]#foriinkubernetes-master- 01 kubernetes-master- 02
kubernetes-master- 03 ; do
> scp kubelet kube-proxy root@$i:/usr/local/bin/
> done
kubelet 100 % 108 MB 54. 0 MB/s 00 : 02
kube-proxy 100 % 37 MB 36. 6 MB/s 00 : 01
kubelet 100 % 108 MB 36. 0 MB/s 00 : 03
kube-proxy 100 % 37 MB 36. 6 MB/s 00 : 01
kubelet 100 % 108 MB 36. 0 MB/s 00 : 03
kube-proxy 100 % 37 MB 36. 6 MB/s 00 : 01
        1. 7 、开启 kubelet 服务
systemctl daemon-reload;systemctl enable --now kubelet;systemctl status
kubelet.service
      1. 8 、 配置kube-proxy服务

kube-proxy是Kubernetes的核心组件,部署在每个Node节点上,它是实现KubernetesService的通信
与负载均衡机制的重要组件;kube-proxy负责为Pod创建代理服务,从apiserver获取所有server信息,并根据
server信息创建代理服务,实现server到Pod的请求路由和转发,从而实现K 8 s层级的虚拟转发网络。

        1. 1 、创建 kube-proxy 配置文件
cat > /etc/kubernetes/cfg/kube-proxy.conf << EOF
KUBE_PROXY_OPTS="--logtostderr=false \\

- -v= 2 \\
- -log-dir=/var/log/kubernetes \\
- -config=/etc/kubernetes/cfg/kube-proxy-config.yml"
EOF
        1. 2 、创建 kube-proxy-config 配置文件
cat > /etc/kubernetes/cfg/kube-proxy-config.yml << EOF
kind: KubeProxyConfiguration
apiVersion: kubeproxy.config.k 8 s.io/v 1 alpha 1
bindAddress: 172. 16. 0. 50
healthzBindAddress: 172. 16. 0. 50 : 10256
metricsBindAddress: 172. 16. 0. 50 : 10249
clientConnection:
burst: 200
kubeconfig: /etc/kubernetes/cfg/kube-proxy.kubeconfig
qps: 100
hostnameOverride: kubernetes-master- 01
clusterCIDR: 10. 96. 0. 0 / 16
enableProfiling: true
mode: "ipvs"
kubeProxyIPTablesConfiguration:
masqueradeAll: false
kubeProxyIPVSConfiguration:
scheduler: rr
excludeCIDRs: []
EOF

6. 11. 5. 8. 2. 1 、配置文件详解

## 选项配置 选项意义

clientConnection 与kube-apiserver交互时的参数设置
burst: 200 临时允许该事件记录值超过qps设定值
kubeconfig kube-proxy客户端连接 kube-apiserver的 kubeconfig文件路径设置
qps: 100 与kube-apiserver交互时的QPS,默认值 5
bindAddress kube-proxy监听地址
healthzBindAddress 用于检查服务的IP地址和端口
metricsBindAddress metrics服务的ip地址和端口。默认: 127. 0. 0. 1 : 10249

clusterCIDR
kube-proxy根据 --cluster-cidr判断集群内部和外部流量,指定 --cluster-cidr 或

- -masquerade-all 选项后kube-proxy才会对访问 ServiceIP的请求做 SNAT

hostnameOverride
参数值必须与 kubelet 的值一致,否则 kube-proxy 启动后会找不到该
Node,从而不会创建任何ipvs 规则;
masqueradeAll 如果使用纯iptables代理,SNAT所有通过服务集群ip发送的通信
mode 使用ipvs模式
scheduler 当proxy为ipvs模式时,ipvs调度类型
        1. 3 、创建 kube-proxy 启动脚本
cat > /usr/lib/systemd/system/kube-proxy.service << EOF
[Unit]
Description=Kubernetes Proxy
After=network.target

[Service]
EnvironmentFile=/etc/kubernetes/cfg/kube-proxy.conf
ExecStart=/usr/local/bin/kube-proxy \$KUBE_PROXY_OPTS
Restart=on-failure
RestartSec= 10
LimitNOFILE= 65536

[Install]
WantedBy=multi-user.target
EOF

6. 11. 5. 8. 4 、分发配置文件

for ip in kubernetes-master- 01 kubernetes-master- 02 kubernetes-master- 03 ;do
scp /etc/kubernetes/cfg/{kube-proxy-config.yml,kube-proxy.conf}
root@${ip}:/etc/kubernetes/cfg/
scp /usr/lib/systemd/system/kube-proxy.service
root@${ip}:/usr/lib/systemd/system/
done

6. 11. 5. 8. 4. 1 、修改kubernetes-master- 02 配置文件
```bash
sed -i 's# 172. 16. 0. 50 # 172. 16. 0. 51 #g' /etc/kubernetes/cfg/kube-proxy-config.yml
sed -i 's#master- 01 #master- 02 #g' /etc/kubernetes/cfg/kube-proxy-config.yml
          1. 2 、修改kubernetes-master- 03 配置文件
sed -i 's# 172. 16. 0. 50 # 172. 16. 0. 52 #g' /etc/kubernetes/cfg/kube-proxy-config.yml
sed -i 's#master- 01 #master- 03 #g' /etc/kubernetes/cfg/kube-proxy-config.yml

6. 11. 5. 8. 4. 3 、查看配置文件

for ip in kubernetes-master- 01 kubernetes-master- 02 kubernetes-master- 03 ;do
echo ''; echo $ip; echo '';
ssh root@$ip "cat /etc/kubernetes/cfg/kube-proxy-config.yml";
done

6. 11. 5. 8. 5 、启动

systemctl daemon-reload; systemctl enable --now kube-proxy; systemctl status
kube-proxy
        1. 6 、查看 kubelet 加入集群请求
[root@kubernetes-master- 01 k 8 s]# kubectl get csr
NAME AGE SIGNERNAME
REQUESTOR CONDITION
node-csr- 51 i 8 zZdDrIFh_zGjblcnJHVTVEZF 03 - MRLmxqW 7 ubuk 50 m
kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Pending
node-csr- 9 DyYdqmYto 4 MW 7 IcGbTPqVePH 9 PHQN 1 nNefZEFcab 7 s 50 m
kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Pending
node-csr-YzbkiJCgLrXM 2 whs 0 h 00 TDceGaBI 3 Ntly 8 Z 7 HGCYvFw 62 m
kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Pending

6. 11. 5. 8. 7 、批准加入

kubectl certificate approve `kubectl get csr | grep "Pending" | awk '{print $ 1 }'`

6. 11. 5. 8. 8 、查看加入集群的新节点

[root@kubernetes-master- 01 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
kubernetes-master- 01 Ready <none> 123 m v 1. 18. 8
kubernetes-master- 02 Ready <none> 120 m v 1. 18. 8
kubernetes-master- 03 Ready <none> 118 m v 1. 18. 8
kubernetes-node- 01 Ready <none> 3 s v 1. 18. 8

6. 11. 5. 8. 9 、设置集群角色

[root@kubernetes-master- 01 ~]# kubectl label nodes kubernetes-master- 01
node-role.kubernetes.io/master=kubernetes-master- 01
node/kubernetes-master- 01 labeled
[root@kubernetes-master- 01 ~]# kubectl label nodes kubernetes-master- 02
node-role.kubernetes.io/master=kubernetes-master- 02
node/kubernetes-master- 02 labeled
[root@kubernetes-master- 01 ~]# kubectl label nodes kubernetes-master- 03
node-role.kubernetes.io/master=kubernetes-master- 03
node/kubernetes-master- 03 labeled
node/kubernetes-node- 01 labeled
[root@kubernetes-master- 01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kubernetes-master- 01 Ready master 135 m v 1. 18. 8
kubernetes-master- 02 Ready master 131 m v 1. 18. 8
kubernetes-master- 03 Ready master 130 m v 1. 18. 8
        1. 10 、 为 master 节点打污点
master节点一般情况下不运行pod,因此我们需要给master节点添加污点使其不被调度。

[root@kubernetes-master- 01 ~]# kubectl taint nodes kubernetes-master- 01
node-role.kubernetes.io/master=kubernetes-master- 01 :NoSchedule --overwrite
node/kubernetes-master- 01 modified
[root@kubernetes-master- 01 ~]# kubectl taint nodes kubernetes-master- 02
node-role.kubernetes.io/master=kubernetes-master- 02 :NoSchedule --overwrite
node/kubernetes-master- 02 modified
[root@kubernetes-master- 01 ~]# kubectl taint nodes kubernetes-master- 03
node-role.kubernetes.io/master=kubernetes-master- 03 :NoSchedule --overwrite
node/kubernetes-master- 03 modified

6. 11. 5. 8. 11 、 部署集群网络插件

kubernetes设计了网络模型,但却将它的实现交给了网络插件,CNI网络插件最主要的功能就是实现POD
资源能够跨主机进行通讯。常见的CNI网络插件:

1. Flannel
2. Calico
3. Canal
4. Contiv
5. OpenContrail
6. NSX-T
7. Kube-router

6. 11. 5. 8. 11. 1 、 安装网络插件

[root@kubernetes-master- 01 /opt]# wget
https://github.com/coreos/flannel/releases/download/v 0. 13. 1 - rc 1 /flannel-v 0. 13. 1 -
rc 1 - linux-amd 64 .tar.gz
[root@kubernetes-master- 01 ~]# tar -xf flannel-v 0. 13. 1 - rc 1 - linux-amd 64 .tar.gz
[root@kubernetes-master- 01 ~]# for i in kubernetes-master- 01 kubernetes-master- 02
kubernetes-master- 03 ; do scp flanneld mk-docker-opts.sh root@$i:/usr/local/bin;
done
flanneld 100 % 34 MB 93. 6 MB/s 00 : 00
mk-docker-opts.sh 100 % 2139 19. 4 MB/s 00 : 00
flanneld 100 % 34 MB 103. 3 MB/s 00 : 00
mk-docker-opts.sh 100 % 2139 8. 5 MB/s 00 : 00
flanneld 100 % 34 MB 106. 5 MB/s 00 : 00
mk-docker-opts.sh 100 % 2139 9. 7 MB/s 00 : 00
          1. 2 、 将flanneld配置写入集群数据库
etcdctl \
- -ca-file=/etc/etcd/ssl/ca.pem \
- -cert-file=/etc/etcd/ssl/etcd.pem \
- -key-file=/etc/etcd/ssl/etcd-key.pem \
- -endpoints="https:// 172. 16. 0. 50 : 2379 ,https:// 172. 16. 0. 51 : 2379 ,https:// 172. 16. 0.
52 : 2379 " \
mk /coreos.com/network/config '{"Network":" 10. 244. 0. 0 / 12 ", "SubnetLen": 21 ,
"Backend": {"Type": "vxlan", "DirectRouting": true}}'

# 使用get查看信息
[root@kubernetes-master- 01 ~]# etcdctl \

- -ca-file=/etc/etcd/ssl/ca.pem \
- -cert-file=/etc/etcd/ssl/etcd.pem \
- -key-file=/etc/etcd/ssl/etcd-key.pem \
- -endpoints="https:// 172. 16. 0. 50 : 2379 ,https:// 172. 16. 0. 51 : 2379 ,https:// 172. 16. 0.
52 : 2379 " \
get /coreos.com/network/config

{"Network":" 10. 244. 0. 0 / 12 ", "SubnetLen": 21 , "Backend": {"Type": "vxlan",
"DirectRouting": true}}

# 同步ETCD配置文件
for i in kubernetes-node- 02 kubernetes-node- 01 ; do
ssh root@$i mkdir -pv /etc/etcd/ssl
scp /etc/etcd/ssl/* root@$i:/etc/etcd/ssl/
done

[root@kubernetes-master- 01 /opt]# for i in kubernetes-node- 01 kubernetes-node- 02 ;
do
> ssh root@$i mkdir -pv /etc/etcd/ssl
> scp /etc/etcd/ssl/* root@$i:/etc/etcd/ssl/
> done
          1. 3 、 注册Flanneld服务
cat > /usr/lib/systemd/system/flanneld.service << EOF
[Unit]
Description=Flanneld address
After=network.target
After=network-online.target
Wants=network-online.target
After=etcd.service
Before=docker.service
[Service]
Type=notify
ExecStart=/usr/local/bin/flanneld \\

- etcd-cafile=/etc/etcd/ssl/ca.pem \\
- etcd-certfile=/etc/etcd/ssl/etcd.pem \\
- etcd-keyfile=/etc/etcd/ssl/etcd-key.pem \\
- etcd-endpoints=https:// 172. 16. 0. 50 : 2379 ,https:// 172. 16. 0. 51 : 2379 ,https:// 172. 16.
0. 52 : 2379 \\
- etcd-prefix=/coreos.com/network \\
- ip-masq
ExecStartPost=/usr/local/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d
/run/flannel/subnet.env
Restart=always
RestartSec= 5
StartLimitInterval= 0
[Install]
WantedBy=multi-user.target
RequiredBy=docker.service
EOF

6. 11. 5. 8. 11. 3. 1 、 配置详解

## 配置选项 选项说明

- etcd-cafile 用于etcd通信的 SSLCA文件
- etcd-certfile 用于 etcd 通信的的 SSL证书文件
- etcd-keyfile 用于 etcd 通信的 SSL密钥文件
- -etcd-endpoints 所有etcd的endpoints
- etcd-prefix etcd中存储的前缀
- ip-masq
    - ip-masq=true如果设置为true,这个参数的目的是让flannel进行ip伪装,而不让
    docker进行ip伪装。这么做的原因是如果docker进行ip伪装,流量再从flannel出
    去,其他host上看到的sourceip就是flannel的网关ip,而不是docker容器的ip

6. 11. 5. 8. 11. 4 、 分发配置文件

[root@kubernetes-master- 01 ~]#foriinkubernetes-master- 02 kubernetes-master- 03 ;do
scp/usr/lib/systemd/system/flanneld.serviceroot@$i:/usr/lib/systemd/system;done
flanneld.service 100 % 697 2. 4 MB/s 00 : 00
flanneld.service 100 % 697 1. 5 MB/s 00 : 00
flanneld.service 100 % 697 3. 4 MB/s 00 : 00
flanneld.service 100 % 697 2. 6 MB/s 00 : 00
          1. 5 、 修改docker启动模式
此举是将docker的网络交给flanneld来管理,形成集群统一管理的网络。
sed -i '/ExecStart/s/\(.*\)/#\ 1 /' /usr/lib/systemd/system/docker.service
sed -i '/ExecReload/a ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPTIONS -H fd://
- -containerd=/run/containerd/containerd.sock'
/usr/lib/systemd/system/docker.service
sed -i '/ExecReload/a EnvironmentFile=-/run/flannel/subnet.env'
/usr/lib/systemd/system/docker.service

[root@kubernetes-master- 01 ~]# sed -i '/ExecStart/s/\(.*\)/#\ 1 /'
/usr/lib/systemd/system/docker.service
[root@kubernetes-master- 01 ~]# sed -i '/ExecReload/a ExecStart=/usr/bin/dockerd
$DOCKER_NETWORK_OPTIONS -H fd:// --containerd=/run/containerd/containerd.sock'
/usr/lib/systemd/system/docker.service
[root@kubernetes-master- 01 ~]# sed -i '/ExecReload/a
EnvironmentFile=-/run/flannel/subnet.env' /usr/lib/systemd/system/docker.service
          1. 6 、 分发docker启动脚本
[root@kubernetes-master- 01 ~]# for ip in kubernetes-master- 02
kubernetes-master- 03 ;do scp /usr/lib/systemd/system/docker.service
root@${ip}:/usr/lib/systemd/system; done
docker.service 100 % 1830 6. 0 MB/s 00 : 00
docker.service 100 % 1830 4. 7 MB/s 00 : 00
docker.service 100 % 1830 6. 6 MB/s 00 : 00
docker.service 100 % 1830 7. 3 MB/s 00 : 00
          1. 7 、 启动Flanneld服务
[root@kubernetes-master- 01 ~]# for i in kubernetes-master- 01 kubernetes-master- 02
kubernetes-master- 03 kubernetes-node- 01 kubernetes-node- 02 ;do
> echo ">>> $i"
> ssh root@$i "systemctl daemon-reload"
> ssh root@$i "systemctl start flanneld"
> ssh root@$i "systemctl restart docker"
> done
>>> kubernetes-master- 01
>>> kubernetes-master- 02
>>> kubernetes-master- 03
>>> kubernetes-node- 01
>>> kubernetes-node- 02
        1. 12 、 部署 CoreDNS
CoreDNS用于集群中Pod解析Service的名字,Kubernetes基于CoreDNS用于服务发现功能。

6. 11. 5. 8. 12. 1 、 下载配置文件

git clone https://github.com/coredns/deployment.git

6. 11. 5. 8. 12. 2 、 绑定集群匿名用户权限

[root@kubernetes-master- 01 ~]# kubectl create clusterrolebinding
cluster-system-anonymous --clusterrole=cluster-admin --user=kubernetes
clusterrolebinding.rbac.authorization.k 8 s.io/cluster-system-anonymous created
          1. 3 、 修改CoreDNS并运行
# 替换coreDNS镜像为:registry.cn-hangzhou.aliyuncs.com/k 8 sos/coredns: 1. 7. 0
[root@kubernetes-master- 01 ~]# sed -i
's#coredns/coredns#registry.cn-hangzhou.aliyuncs.com/k 8 sos/coredns#g'
coredns.yaml.sed
[root@kubernetes-master- 01 ~]# ./deploy.sh -i 10. 96. 0. 2 - s | kubectl apply -f -
serviceaccount/coredns unchanged
clusterrole.rbac.authorization.k 8 s.io/system:coredns unchanged
clusterrolebinding.rbac.authorization.k 8 s.io/system:coredns unchanged
configmap/coredns unchanged
deployment.apps/coredns unchanged
service/kube-dns created
[root@kubernetes-master- 01 ~]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns- 85 b 4878 f 78 - 5 xr 2 z 1 / 1 Running 0 2 m 31 s

6. 11. 5. 8. 13 、 绑定用户的超管权限

## 此举是将超管的用户权限绑定到集群。

[root@kubernetes-master- 01 ~]# kubectl create clusterrolebinding
cluster-system-anonymous --clusterrole=cluster-admin --user=kubernetes
clusterrolebinding.rbac.authorization.k 8 s.io/cluster-system-anonymous created

6. 11. 5. 8. 14 、 测试集群 DNS

[root@kubernetes-master- 01 ~]# kubectl run test -it --rm --image=busybox: 1. 28. 3
If you don't see a command prompt, try pressing enter.
/ # nslookup docs.docs.svc.cluster.local
Server: 10. 96. 0. 2
Address 1 : 10. 96. 0. 2 kube-dns.kube-system.svc.cluster.local

Name: docs.docs.svc.cluster.local
Address 1 : 10. 241. 96. 2 10 - 241 - 96 - 2 .docs.docs.svc.cluster.local
Address 2 : 10. 242. 0. 2 10 - 242 - 0 - 2 .docs.docs.svc.cluster.local
  1. 12 、 部署集群Node节点
Node节点主要负责提供应用运行环境,其最主要的组件就是kube-proxy和kubelet。接下来我们就在集群
当中部署Node节点。

6. 12. 1 、分发工具

[root@kubernetes-master- 01 bin]#foriin kubernetes-node- 02 kubernetes-node- 01 ;do
scp kubelet kube-proxy root@$i:/usr/local/bin/; done
kubelet 100 % 108 MB 120. 2 MB/s 00 : 00
kube-proxy 100 % 37 MB 98. 1 MB/s 00 : 00
kubelet 100 % 108 MB 117. 4 MB/s 00 : 00
for i in kubernetes-node- 02 kubernetes-node- 01 ; do echo $i; ssh root@$i "ls -lh
/usr/local/bin"; done
    1. 2 、颁发 Node 节点证书
for i in kubernetes-node- 01 kubernetes-node- 02 ; do
ssh root@$i "mkdir -pv /etc/kubernetes/ssl"
scp -pr ./{ca*.pem,admin*pem,kube-proxy*pem} root@$i:/etc/kubernetes/ssl
done
    1. 3 、配置 kubelet 服务
for ip in kubernetes-node- 01 kubernetes-node- 02 ;do
ssh root@${ip} "mkdir -pv /var/log/kubernetes"
ssh root@${ip} "mkdir -pv /etc/kubernetes/cfg/"
scp /etc/kubernetes/cfg/{kubelet-config.yml,kubelet.conf}
root@${ip}:/etc/kubernetes/cfg
scp /usr/lib/systemd/system/kubelet.service root@${ip}:/usr/lib/systemd/system
done

6. 12. 4 、处理配置文件

# 修改kubernetes-node- 01 配置
sed -i 's#master- 01 #node- 01 #g' /etc/kubernetes/cfg/kubelet.conf
sed -i 's# 172. 16. 0. 50 # 172. 16. 0. 53 #g' /etc/kubernetes/cfg/kubelet-config.yml

# 修改kubernetes-node- 02 配置
sed -i 's#master- 01 #node- 02 #g' /etc/kubernetes/cfg/kubelet.conf
sed -i 's# 172. 16. 0. 50 # 172. 16. 0. 54 #g' /etc/kubernetes/cfg/kubelet-config.yml
    1. 5 、开启 kubelet
systemctl daemon-reload;systemctl enable --now kubelet;systemctl status
kubelet.service
    1. 6 、配置 kube-proxy 服务
for ip in kubernetes-node- 01 kubernetes-node- 02 ;do
scp /etc/kubernetes/cfg/{kube-proxy-config.yml,kube-proxy.conf}
root@${ip}:/etc/kubernetes/cfg/
scp /usr/lib/systemd/system/kube-proxy.service
root@${ip}:/usr/lib/systemd/system/
done

6. 12. 7 、修改配置文件

# 修改kubernetes-node- 01 节点

sed -i 's# 172. 16. 0. 50 # 172. 16. 0. 54 #g' /etc/kubernetes/cfg/kube-proxy-config.yml
sed -i 's#master- 01 #node- 02 #g' /etc/kubernetes/cfg/kube-proxy-config.yml

# 修改kubernetes-node- 02 节点
sed -i 's# 172. 16. 0. 50 # 172. 16. 0. 54 #g' /etc/kubernetes/cfg/kube-proxy-config.yml
sed -i 's#master- 01 #node- 02 #g' /etc/kubernetes/cfg/kube-proxy-config.yml

6. 12. 8 、设置开机自启动

systemctl daemon-reload; systemctl enable --now kube-proxy; systemctl status
kube-proxy

6. 12. 9 、分发网络插件

for i in kubernetes-node- 01 kubernetes-node- 02 ; do scp flanneld mk-docker-opts.sh
root@$i:/usr/local/bin; done

6. 12. 10 、 同步 ETCD 配置至节点

for i in kubernetes-node- 01 kubernetes-node- 02 ;do
ssh root@$i "mkdir -pv /etc/etcd/ssl"
scp -p /etc/etcd/ssl/*.pem root@$i:/etc/etcd/ssl
done
    1. 11 、 分发 flannel 服务脚本
for i in kubernetes-node- 01 kubernetes-node- 02 ;do scp
/usr/lib/systemd/system/flanneld.service root@$i:/usr/lib/systemd/system; done
    1. 12 、 分发 Docker 脚本
[root@kubernetes-master- 01 ~]# for ip in kubernetes-node- 01 kubernetes-node- 02 ;do
scp /usr/lib/systemd/system/docker.service root@${ip}:/usr/lib/systemd/system;
done
docker.service 100 % 1830 6. 0 MB/s 00 : 00
docker.service 100 % 1830 4. 7 MB/s 00 : 00
    1. 13 、 重启 docker, 开启 flanneld 服务
[root@kubernetes-master- 01 ~]# for i in kubernetes-node- 01 kubernetes-node- 02 ;do
> echo ">>> $i"
> ssh root@$i "systemctl daemon-reload"
> ssh root@$i "systemctl start flanneld"
> ssh root@$i "systemctl restart docker"
> done
>>> kubernetes-master- 01
>>> kubernetes-master- 02
>>> kubernetes-master- 03
>>> kubernetes-node- 01
>>> kubernetes-node- 02
    1. 14 、 查看 kubelet 加入集群请求
[root@kubernetes-master- 01 k 8 s]# kubectl get csr
NAME AGE SIGNERNAME
REQUESTOR CONDITION
node-csr- 51 i 8 zZdDrIFh_zGjblcnJHVTVEZF 03 - MRLmxqW 7 ubuk 50 m
kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Pending
node-csr- 9 DyYdqmYto 4 MW 7 IcGbTPqVePH 9 PHQN 1 nNefZEFcab 7 s 50 m
kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Pending
node-csr-YzbkiJCgLrXM 2 whs 0 h 00 TDceGaBI 3 Ntly 8 Z 7 HGCYvFw 62 m
kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Pending

6. 12. 15 、 批准加入

kubectl certificate approve `kubectl get csr | grep "Pending" | awk '{print $ 1 }'`

6. 12. 16 、 查看节点

[root@kubernetes-master- 01 k 8 s]# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP
OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
kubernetes-master- 01 Ready master 10 d v 1. 18. 8 192. 168. 12. 71 <none>
CentOS Linux 7 (Core) 4. 4. 233 - 1 .el 7 .elrepo.x 86 _ 64 docker:// 19. 3. 13
kubernetes-master- 02 Ready master 10 d v 1. 18. 8 192. 168. 12. 72 <none>
CentOS Linux 7 (Core) 4. 4. 233 - 1 .el 7 .elrepo.x 86 _ 64 docker:// 19. 3. 13
kubernetes-master- 03 Ready master 10 d v 1. 18. 8 192. 168. 12. 73 <none>
CentOS Linux 7 (Core) 4. 4. 233 - 1 .el 7 .elrepo.x 86 _ 64 docker:// 19. 3. 13
kubernetes-node- 01 Ready node 10 d v 1. 18. 8 192. 168. 12. 74 <none>
CentOS Linux 7 (Core) 4. 4. 233 - 1 .el 7 .elrepo.x 86 _ 64 docker:// 19. 3. 13
kubernetes-node- 02 Ready node 10 d v 1. 18. 8 192. 168. 12. 75 <none>
CentOS Linux 7 (Core) 4. 4. 233 - 1 .el 7 .elrepo.x 86 _ 64 docker:// 19. 3. 13

6. 12. 17 、 验证集群

[root@kubernetes-master- 01 ~]# kubectl create deployment nginx --image=nginx
deployment.apps/nginx created
[root@kubernetes-master- 01 ~]# kubectl expose deployment nginx --port= 80
- -type=NodePort
service/nginx exposed

三、 部署Dashboard

Dashboard 是基于网页的 Kubernetes 用户界面。您可以使用 Dashboard 将容器应用部署到
Kubernetes 集群中,也可以对容器应用排错,还能管理集群本身及其附属资源。您可以使用 Dashboard获取
运行在集群中的应用的概览信息,也可以创建或者修改Kubernetes 资源(如 Deployment,Job,DaemonSet
等等)。例如,您可以对 Deployment实现弹性伸缩、发起滚动升级、重启 Pod 或者使用向导创建新的应用。

1 、 下载资源清单

[root@localhost ~]# wget
https://raw.githubusercontent.com/kubernetes/dashboard/v 2. 0. 4 /aio/deploy/recomme
nded.yaml
- - 2020 - 09 - 15 12 : 05 : 15 - -
https://raw.githubusercontent.com/kubernetes/dashboard/v 2. 0. 4 /aio/deploy/recomme
nded.yaml
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151. 101. 8. 133
Connecting to raw.githubusercontent.com
(raw.githubusercontent.com)| 151. 101. 8. 133 |: 443 ... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7552 ( 7. 4 K) [text/plain]
Saving to: ‘recommended.yaml’

100 %[===========================================================================
================================================================================
========================================>] 7 , 552 - -.-K/s in 0 s

2020 - 09 - 15 12 : 05 : 17 ( 29. 3 MB/s) - ‘recommended.yaml’saved [ 7552 / 7552 ]

[root@localhost ~]# cat recommended.yaml | grep image
image: kubernetesui/dashboard:v 2. 0. 4
imagePullPolicy: Always
image: kubernetesui/metrics-scraper:v 1. 0. 4
[root@localhost ~]# sed -i
's#kubernetesui/dashboard#registry.cn-hangzhou.aliyuncs.com/k 8 sos/dashboard#g'
recommended.yaml
[root@localhost ~]# sed -i
's#kubernetesui/metrics-scraper#registry.cn-hangzhou.aliyuncs.com/k 8 sos/metrics-
scraper#g' recommended.yaml
[root@localhost ~]# cat recommended.yaml | grep image
image: registry.cn-hangzhou.aliyuncs.com/k 8 sos/dashboard:v 2. 0. 4
imagePullPolicy: Always
image: registry.cn-hangzhou.aliyuncs.com/k 8 sos/metrics-scraper:v 1. 0. 4

2 、 修改 Servicekubernetes-dashboard

## # 将

kind: Service
apiVersion: v 1
metadata:
labels:
k 8 s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
ports:

- port: 443
    targetPort: 8443
selector:
k 8 s-app: kubernetes-dashboard

# 修改为
kind: Service
apiVersion: v 1
metadata:
labels:
k 8 s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
ports:

- port: 443
    targetPort: 8443
    nodePort: 30001
selector:
k 8 s-app: kubernetes-dashboard
type: NodePort

3 、 部署 Dashboard

[root@localhost ~]# kubectl apply -f recommended.yaml
namespace/kubernetes-dashboard created
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k 8 s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k 8 s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k 8 s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k 8 s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created
[root@localhost ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1 / 1 Running 0 7 m 5 s
[root@localhost ~]# kubectl get pods -n kubernetes-dashboard
NAME READY STATUS RESTARTS AGE
dashboard-metrics-scraper- 79694 cfc 8 b-cxr 8 x 1 / 1 Running 0 18 s
kubernetes-dashboard- 57 bd 6 cb 5 d 6 - fgxnf 1 / 1 Running 0 18 s

4 、 查看部署状态以及部署资源

[root@localhost ~]# kubectl get -f recommended.yaml
NAME STATUS AGE
namespace/kubernetes-dashboard Active 10 s

NAME SECRETS AGE
serviceaccount/kubernetes-dashboard 1 10 s

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
AGE
service/kubernetes-dashboard NodePort 10. 105. 99. 98 <none>
443 : 30001 /TCP 10 s

NAME TYPE DATA AGE
secret/kubernetes-dashboard-certs Opaque 0 10 s
secret/kubernetes-dashboard-csrf Opaque 1 10 s
secret/kubernetes-dashboard-key-holder Opaque 2 10 s

NAME DATA AGE
configmap/kubernetes-dashboard-settings 0 10 s

NAME CREATED AT
role.rbac.authorization.k 8 s.io/kubernetes-dashboard 2020 - 09 - 15 T 04 : 16 : 09 Z

NAME CREATED AT
clusterrole.rbac.authorization.k 8 s.io/kubernetes-dashboard 2020 - 09 - 15 T 04 : 16 : 09 Z

NAME ROLE AGE
rolebinding.rbac.authorization.k 8 s.io/kubernetes-dashboard
Role/kubernetes-dashboard 10 s

NAME ROLE
AGE
clusterrolebinding.rbac.authorization.k 8 s.io/kubernetes-dashboard
ClusterRole/kubernetes-dashboard 10 s

NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/kubernetes-dashboard 1 / 1 1 1 10 s

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
AGE
service/dashboard-metrics-scraper ClusterIP 10. 99. 80. 170 <none>
8000 /TCP 10 s

NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/dashboard-metrics-scraper 1 / 1 1 1 10 s

5 、 部署 Token

[root@localhost ~]# vim token.yaml
[root@localhost ~]# cat token.yaml
apiVersion: v 1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kube-system

- --
apiVersion: rbac.authorization.k 8 s.io/v 1
kind: ClusterRoleBinding
metadata:
    name: admin-user
    annotations:
       rbac.authorization.kubernetes.io/autoupdate: "true"
roleRef:
    apiGroup: rbac.authorization.k 8 s.io
    kind: ClusterRole
    name: cluster-admin
subjects:
- kind: ServiceAccount
    name: admin-user
    namespace: kube-system
[root@localhost ~]# kubectl apply -f token.yaml
serviceaccount/admin-user created
clusterrolebinding.rbac.authorization.k 8 s.io/admin-user created
[root@localhost~]#kubectl-nkube-system describesecret $(kubectl-nkube-system
get secret | grep admin-user | awk '{print $ 1 }')
Name: admin-user-token-b 6 kp 7
Namespace: kube-system
Labels: <none>
Annotations: kubernetes.io/service-account.name: admin-user
    kubernetes.io/service-account.uid:

43 d 73 e 50 - b 17 b- 4 bd 3 - a 502 - d 1678364 fad 5

Type: kubernetes.io/service-account-token

Data
====
ca.crt: 1066 bytes
namespace: 11 bytes
token:
eyJhbGciOiJSUzI 1 NiIsImtpZCI 6 ImZxdTVycGZJUDdmclFKRXFFSXB 0 enEzbzBUT 1 VGaWx 3 aEMzWGdH
S 3 ZOVEUifQ.eyJpc 3 MiOiJrdWJlcm 5 ldGVzL 3 NlcnZpY 2 VhY 2 NvdW 50 Iiwia 3 ViZXJuZXRlcy 5 pby 9 zZ
XJ 2 aWNlYWNjb 3 VudC 9 uYW 1 lc 3 BhY 2 UiOiJrdWJlLXN 5 c 3 RlbSIsImt 1 YmVybmV 0 ZXMuaW 8 vc 2 VydmljZ
WFjY 291 bnQvc 2 VjcmV 0 Lm 5 hbWUiOiJhZG 1 pbi 11 c 2 VyLXRva 2 VuLWI 2 a 3 A 3 Iiwia 3 ViZXJuZXRlcy 5 pb
y 9 zZXJ 2 aWNlYWNjb 3 VudC 9 zZXJ 2 aWNlLWFjY 291 bnQubmFtZSI 6 ImFkbWluLXVzZXIiLCJrdWJlcm 5 ld
GVzLmlvL 3 NlcnZpY 2 VhY 2 NvdW 50 L 3 NlcnZpY 2 UtYWNjb 3 VudC 51 aWQiOiI 0 M 2 Q 3 M 2 U 1 MC 1 iMTdiLTRiZ
DMtYTUwMi 1 kMTY 3 ODM 2 NGZhZDUiLCJzdWIiOiJzeXN 0 ZW 06 c 2 VydmljZWFjY 291 bnQ 6 a 3 ViZS 1 zeXN 0 Z
W 06 YWRtaW 4 tdXNlciJ 9 .H 8 xSQR 6 a 8 wrBDcCk-hHDfEuJwsupGmWNMMPd_ 2 sNbIRr 2 - TH 0 IwoCPmZsqSw
4 TJcOQwNFY 6 rW 3 w 5 J 0 UJiPT 0 JfNbQ 2 g 2 QccRXil 8 i 1 xCws 9 X-JvZaTQ 9 hv 4 zFOQjeYLkO 7 AYrLokmbGW
3 wM 2 wf 0 EhoK 6 PkLrW-JwxNQdcq_x 1 cJ_ZuHGmIP-MkGI 7 q 3 xel 1 NJgF_D 57 krANTcPfimUCqHmnqP 6 OH
FlDDaeGC 83 WwCAMyW 2 - WH-LRK 1 UEOEg 8 HrCH 8 KE 5 XRraEHeOBAThoNfemhRbqJMMHOIL 2 l_P 0 w 62 hpG 0
5 D 01 N 9 lgIEQCc 8 eQJHylrPurk 37 ULPE 8 zOPiV 4 oadg

四、 Kubernetes基础

1 、 kubernetes 基础使用篇

  1. 1 、 kubernetes带来的变革
## 1. 1. 1 、 对于开发人员

## 由于公司业务多,开发环境、测试环境、预生产环境和生产环境都是隔离的,而且除了生产环境,为了节省

成本,其他环境可能是没有日志收集的,在没有用k 8 s的时候,查看线下测试的日志,需要开发或者测试人员,
找到对应的机器,在找到对应的容器,然后才能查看日志,在用了k 8 s之后,开发和测试可以直接在k 8 s的
dashboard到对应的namespace,即可定位到业务的容器,然后可以直接通过控制台查看到对应的日志,大大
降低了操作时间。

把应用部署到k 8 s之后,代码的发布、回滚,以及蓝绿发布、金丝雀发布等都变得特别简单,不仅加快了业
务代码迭代的速度,而且全程无需人工干预。目前我们使用jenkins、gitrunner进行发版或者回滚等,从开发环
境到测试环境,到生产环境,完全遵守一次构建,多集群、多环境部署,通过不同的启动参数、不同的环境变量、
不同的配置文件实现区分不同的环境。目前已经实现Python、Java、PHP、NodeJS、Go、.NETCore、Python
等多种语言的一键式发版、一键式回滚,大大提高了开发人员的开发效率。

## 在使用服务网格后,开发人员在开发应用的过程中,不用再关心代码的网络部分,这些功能都被服务网格实

## 现,让开发人员可以只关心代码逻辑部分,即可实现网络部分的功能,比如:断流、分流、路由、负载均衡、限

## 速和触发故障等功能。

## 测试过程中,可能同时多套环境,当然也会需要再创建一套测试环境,之前测试环境的创建,需要找运维或

者自行手工搭建。在迁移至k 8 s集群后,只需要在jenkins上点点鼠标即可在k 8 s集群上创建一套新的测试环境。

1. 1. 2 、 对于运维人员

## 如果你是一名运维人员,可能经常因为一些重复、繁琐的工作感觉厌倦。比如:这个需要一套新的测试环境,

## 那个需要一套新的测试环境,之前可能需要装系统、装依赖环境、开通权限等等。而如今,可以直接用镜像直接

部署一套新的测试环境,甚至全程无需自己干预,开发人员通过jenkins或者自动化运维平台即可一键式创建,
大大降低了运维成本。

一开始,公司业务故障,可能是因为基础环境不一致、依赖不一致、端口冲突等等问题,现在实现Docker
镜像部署,k 8 s编排,所有的依赖、基础都是一样的,并且环境的自动化扩容、健康检查、容灾、恢复都是全自
动的,大大减少了因为这类基础问题引发的故障。也有可能公司业务是由于服务器宕机、网络等问题,造成服务
不可用,此类情况均需要运维人员及时去修复,而如今,可能在你收到告警信息的时候,k 8 s已经帮你恢复了。

在没有使用k 8 s时,业务应用的扩容和缩容,都需要人工去处理,从采购服务器、上架、到部署依赖环境,
不仅需要大量的人力物力,而且非常容易在中间过程出现问题,又要花费大量的时间去查找问题。成功上架后,
还需要在前端反代端添加或该服务器,而如今,可以利用k 8 s的弹性计算,一键式进行扩容和缩容,不仅大大提
高了运维效率,而且还节省了不少的服务器资源,提高了资源利用率。

对于反代配置方面,比如可能你并不会,或者对nginx的配置规则并不熟悉,一些高级的功能你也不会实现,
而如今,利用k 8 s的ingress即可简单的实现那些复杂的逻辑。并且也不会在遇到nginx少加一个斜杠和多加一
个斜杠的问题。

对于负载均衡方面,之前负载均衡可能是Nginx、LVS、HAProxy、F 5 等,云上可能是云服务商提供的不在
均衡机制。每次添加删除节点时,都需要手动去配置前端负载均衡,手动去匹配后端节点,而如今,使用k 8 s
内部的service可以动态发现实现自动管理节点,并且支持自动扩容缩容。之前遇到高峰流量时,经常服务器性
能不够,需要临时加服务器面对高峰流量,而如今对于高性能k 8 s集群加上serverless,基本实现无需管理,自
动扩容。

对于高可用方面,k 8 s天生的高可用功能,彻底释放了双手,无需再去创建各类高可用工具、检测检查脚本。
k 8 s支持进程接口级别的健康检查,如发现接口超时或者返回值不正确,会自动处理该问题。

对于中间件搭建方面,根据定义好的资源文件,可以实现秒级搭建各类中间件高可用集群,并且支持一键式
扩缩容,如Redis、RabbitMQ、Zookeeper等,并且大大减少了出错的概率。

对于应用端口方面,传统行业中,一个服务器可能跑了很多进程,每个进程都有一个端口,需要人为的去配
置端口,并且还需要考虑端口冲突的问题,如果有防火墙的话,还需要配置防火墙,在k 8 s中,端口统一管理,

统一配置,每个应用的端口都可设置成一样的,之后通过service进行负载均衡,大大降低了端口管理的复杂度
和端口冲突。

无论是对于开发人员、测试人员还是运维人员,k 8 s的诞生,不仅减少了工作的复杂性,还减少了各种成本。
上述带来的变革只是其中比较小的一部分,更多优点只有用了才能体会到。
  1. 2 、 kubernetes带来的挑战

首先是对于k 8 s的学习本身就是很难的,概念太多,无从入手,可能学习了一个月也无法入门,甚至连集群
也搭建不出来,使人望而却步。并且k 8 s对运维的技术能力要求比较高,已经不仅仅局限于传统运维,有时候你
可能要修改业务代码等。并且需要掌握的知识也需要很多,你可能需要掌握公司所有使用到的代码,比如代码是
如何进行编译的、如何正确发布、如何修改代码配置文件等,这对于运维人员,也是一种挑战。Kubernetes之
所以被叫做k 8 s,业界有两种说法,通俗的说法是k和s之间有 8 个字母,另一种比较说法是k 8 s集群至少需要
搭建 8 遍才能搭建成功。当然,在实际使用时,可能不止 8 遍。k 8 s的诞生,把运维从传统转变到了DevOps
方向,需要面临的问题会更多,需要面临的新技术也有很多,但是当你掌握到了k 8 s的核心使用,就会受益终身。

  1. 3 、 Pod

K 8 s有很多技术概念,同时对应很多API对象,最重要的也是最基础的是微服务Pod。Pod是在K 8 s集群
中运行部署应用或服务的最小单元,它是可以支持多容器的。Pod的设计理念是支持多个容器在一个Pod中共
享网络地址和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。Pod对多容器的支
持是K 8 s最基础的设计理念。比如你运行一个操作系统发行版的软件仓库,一个Nginx容器用来发布软件,另
一个容器专门用来从源仓库做同步,这两个容器的镜像不太可能是一个团队开发的,但是他们一块儿工作才能提
供一个微服务;这种情况下,不同的团队各自开发构建自己的容器镜像,在部署的时候组合成一个微服务对外提
供服务。这就是K 8 S中的POD。

Pod是K 8 s集群中所有业务类型的基础,可以看作运行在K 8 s集群中的小机器人,不同类型的业务就需要
不同类型的小机器人去执行。目前K 8 s中的业务主要可以分为长期伺服型(long-running)、批处理型(batch)、
节点后台支撑型(node-daemon)和有状态应用型(statefulapplication);分别对应的小机器人控制器为
Deployment、Job、DaemonSet和StatefulSet。

    1. 1 、 Pod 的初体验
apiVersion: v 1
kind: Pod
metadata:
name: first-pod
labels:
app: bash
spec:
containers:

- name: bash-container
    image: busybox
    command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 10 ']

1. 3. 1. 1 、 执行结果

[root@instance-gvpb 80 ao docs]# kubectl apply -f test.yaml
pod/first-pod created
[root@instance-gvpb 80 ao docs]# kubectl get -f test.yaml
NAME READY STATUS RESTARTS AGE
first-pod 0 / 1 ContainerCreating 0 6 s
    1. 2 、 Pod 带来的好处
  1. Pod做为一个可以独立运行的服务单元,简化了应用部署的难度,以更高的抽象层次为应用部署管提供了极
    大的方便。

  2. Pod做为最小的应用实例可以独立运行,因此可以方便的进行部署、水平扩展和收缩、方便进行调度管理与
    资源的分配。

  3. Pod中的容器共享相同的数据和网络地址空间,Pod之间也进行了统一的资源管理与分配。

    1. 3 、 Pod 是如何管理多个容器的

Pod中可以同时运行多个进程(作为容器运行)协同工作。同一个Pod中的容器会自动的分配到同一个 node
上。同一个Pod中的容器共享资源、网络环境和依赖,所以它们总是被同时调度。在一个Pod中同时运行多个
容器是一种比较高级的用法。只有当你的容器需要紧密配合协作的时候才考虑用这种模式。

    1. 4 、 Pod 中的数据持久性

Pod在设计支持就不是作为持久化实体的。在调度失败、节点故障、缺少资源或者节点维护的状态下都会死
掉会被驱逐。通常,我们是需要借助类似于Docker存储卷这样的资源来做Pod的数据持久化的。

    1. 5 、 Pod 的生命周期和重启策略

Pod 在整个生命周期过程中被系统定义为各种状态,熟悉 Pod各种状态对于我 理解如何设置Pod的调度策
略、重启策略是很有必要的。

      1. 1 、 Pod的状态

状态值 描述

挂起(Pending) APIServer
创建了pod资源对象已存入etcd中,但它尚未被调度完成,或者仍处于从
仓库下载镜像的过程中。
运行中(Running) Pod已经被调度至某节点,并且所有容器都已经被kubelet创建完成
成功(Succeeded) Pod中的所有容器都已经成功终止并且不会被重启

失败(Failed)
Pod中的所有容器都已终止了,并且至少有一个容器是因为失败终止。即容器以非 0 状
态退出或者被系统禁止。

未知(Unknown)
ApiServer无法正常获取到Pod对象的状态信息,通常是由于无法与所在工作节点的
kubelet通信所致。

      1. 2 、 Pod的重启策略

Pod 重启策略( RestartPolicy)应用于 Pod内的所有容器,井且仅在 Pod所处的 Node上由kubelet
进行判断和重启操作。当某个容器异常退出或者健康检查失败时,kubelet将根据 RestartPolicy设置来进行相
应的操作。Pod的重启策略包括:Always、OnFailure和Never,默认值为Always

1. Always:当容器失效时,由kubelet自动重启该容器。
2. OnFailure:当容器终止运行且退出码不为 0 时,由kubelet自动重启该容器
3. Never:不论容器运行状态如何,kubelet都不会重启该容器。

kubelet重启失效容器的时间间隔以 sync-frequency 乘以 2 n来计算;例如 1 、 2 、 4 、 8 倍等,最长延时
5 min,并且在成功重启后的 10 min后重置该时间。

Pod的重启策略与控制方式息息相关,当前可用于管理Pod的控制器包括ReplicationController、Job、
DaemonSet及直接通过kubelet管理(静态Pod)。每种控制器对Pod的重启策略要求如下:

1 .RC和DaemonSet:必须设置为Always,需要保证该容器持续运行。
2 .Job和CronJob:OnFailure或Never,确保容器执行完成后不再重启。
3 .kubelet:在Pod失效时自动重启它,不论将RestartPolicy设置为什么值,也不会对Pod进行健康检查。
    1. 6 、 Pod 的资源清单详解
apiVersion: v 1 # 必选,API的版本号
kind: Pod # 必选,类型Pod
metadata: # 必选,元数据
name: nginx # 必选,符合RFC 1035 规范的Pod名称
namespace: web-testing #可选,不指定默认为default,Pod所在的命名空间
labels: # 可选,标签选择器,一般用于Selector
- app: nginx
annotations: #可选,注释列表
- app: nginx
spec: # 必选,用于定义容器的详细信息
containers: # 必选,容器列表
- name: nginx #必选,符合RFC 1035 规范的容器名称
image: nginx:v 1 # 必选,容器所用的镜像的地址
imagePullPolicy: Always # 可选,镜像拉取策略
workingDir: /usr/share/nginx/html # 可选,容器的工作目录
volumeMounts: # 可选,存储卷配置
- name: webroot # 存储卷名称
mountPath: /usr/share/nginx/html #挂载目录
readOnly: true # 只读
ports: # 可选,容器需要暴露的端口号列表
- name: http # 端口名称
containerPort: 80 # 端口号
protocol: TCP #端口协议,默认TCP
env: #可选,环境变量配置
- name: TZ # 变量名
value: Asia/Shanghai
- name: LANG
value: en_US.utf 8
resources: # 可选,资源限制和资源请求限制
limits: # 最大限制设置
cpu: 1000 m
memory: 1024 MiB
requests: #启动所需的资源
cpu: 100 m
memory: 512 MiB
readinessProbe: # 可选,容器状态检查
httpGet: # 检测方式
path: / #检查路径
port: 80 #监控端口
timeoutSeconds: 2 # 超时时间
initialDelaySeconds: 60 #初始化时间
livenessProbe: #可选,监控状态检查
exec: # 检测方式
command:
- cat
- /health
httpGet: # 检测方式
path: /_health
port: 8080
httpHeaders:
- name: end-user
value: jason
tcpSocket: # 检测方式
port: 80
initialDelaySeconds: 60 #初始化时间
timeoutSeconds: 2 # 超时时间
periodSeconds: 5 #检测间隔
successThreshold: 2 # 检查成功为 2 次表示就绪
failureThreshold: 1 # 检测失败 1 次表示未就绪
securityContext: # 可选,限制容器不可信的行为
provoleged: false
restartPolicy: Always # 可选,默认为Always
nodeSelector: #可选,指定Node节点
region: subnet 7
imagePullSecrets: # 可选,拉取镜像使用的secret
- name: default-dockercfg- 86258
hostNetwork: false # 可选,是否为主机模式,如是,会占用主机端口
volumes: # 共享存储卷列表
- name: webroot #名称,与上述对应
emptyDir: {} # 共享卷类型,空
hostPath: # 共享卷类型,本机目录
path: /etc/hosts
secret: #共享卷类型,secret模式,一般用于密码
secretName: default-token-tf 2 jp #名称
defaultMode: 420 # 权限
configMap: # 一般用于配置文件
name: nginx-conf
defaultMode: 420
  1. 4 、 Label

Label是Kubernetes系统中另外一个核心概念。一个Label是一个key=value的键值对,其中key与vaue
由用户自己指定。Label可以附加到各种资源对象上,例如Node、Pod、Service、RC等,一个资源对象可以
定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上去,Label通常在资源对象定义时
确定,也可以在对象创建后动态添加或者删除。

我们可以通过指定的资源对象捆绑一个或多个不同的Label来实现多维度的资源分组管理功能,以便于灵
活、方便地进行资源分配、调度、配置、部署等管理工作。例如:部署不同版本的应用到不同的环境中;或者监
控和分析应用(日志记录、监控、告警)等。一些常用等label示例如下。

 版本标签:"release":"stable","release":"canary"
 环境标签:"environment":"dev","environment":"production"
 架构标签:"tier":"frontend","tier":"backend","tier":"middleware"
 分区标签:"partition":"customerA","partition":"customerB"
 质量管控标签:"track":"daily","track":"weekly"

Label相当于我们熟悉的“标签”,給某个资源对象定义一个Label,就相当于給它打了一个标签,随后可
以通过LabelSelector(标签选择器)查询和筛选拥有某些Label的资源对象,Kubernetes通过这种方式实现了
类似SQL的简单又通用的对象查询机制。

    1. 1 、 根据标签来查询 Pod
[root@kubernetes-master- 01 ~]# kubectl get pod --show-labels -n docs
NAME READY STATUS RESTARTS AGE LABELS
docs- 85686 dc 954 - 6 jv 56 1 / 1 Running 1 10 d
app=docs,pod-template-hash= 85686 dc 954
docs- 85686 dc 954 - hr 427 1 / 1 Running 0 10 d
app=docs,pod-template-hash= 85686 dc 954

1. 4. 2 、 增加标签

[root@kubernetes-master- 01 ~]# kubectl label pod -n docs docs- 85686 dc 954 - 6 jv 56
dev=test
pod/docs- 85686 dc 954 - 6 jv 56 labeled
[root@kubernetes-master- 01 ~]# kubectl get pod --show-labels -n docs
NAME READY STATUS RESTARTS AGE LABELS
docs- 85686 dc 954 - 6 jv 56 1 / 1 Running 1 10 d
app=docs,dev=test,pod-template-hash= 85686 dc 954
docs- 85686 dc 954 - hr 427 1 / 1 Running 0 10 d
app=docs,pod-template-hash= 85686 dc 954

1. 4. 3 、 删除标签

[root@kubernetes-master- 01 ~]#kubectllabelpod-ndocsdocs- 85686 dc 954 - 6 jv 56 dev-
pod/docs- 85686 dc 954 - 6 jv 56 labeled
[root@kubernetes-master- 01 ~]# kubectl get pod --show-labels -n docs
NAME READY STATUS RESTARTS AGE LABELS
docs- 85686 dc 954 - 6 jv 56 1 / 1 Running 1 10 d
app=docs,pod-template-hash= 85686 dc 954
docs- 85686 dc 954 - hr 427 1 / 1 Running 0 10 d
app=docs,pod-template-hash= 85686 dc 954

1. 4. 4 、 可以将标签显示为列

[root@kubernetes-master- 01 ~]# kubectl get pods -L app -n docs
NAME READY STATUS RESTARTS AGE APP
docs- 85686 dc 954 - 6 jv 56 1 / 1 Running 1 10 d docs
docs- 85686 dc 954 - hr 427 1 / 1 Running 0 10 d docs
  1. 5 、 service资源

service是k 8 s中的一个重要概念,主要是提供负载均衡和服务自动发现。它是k 8 s中最核心的资源之一,
每一个Service就是我们平常所说的一个“微服务”。在非k 8 s世界中,管理员可以通过在配置文件中指定IP
地址或主机名,容许客户端访问,但在k 8 s中这种方式是行不通的。因为Pod是有生命周期的,它们可以被创
建或销毁。虽然通过控制器能够动态地创建Pod,但当Pod被分配到某个节点时,K 8 s都会为其分配一个IP地
址,而该IP地址不总是稳定可依赖的。因此,在 Kubernetes集群中,如果一组 Pod(称为 backend)为其
它 Pod (称为frontend)提供服务,那么那些 frontend 该如何发现,并连接到这组backend的Pod呢?

如上图所示,Kubernetes的Service定义了一个服务的访问入口,前端的应用(Pod)通过这个入口地址访
问其背后的一组由Pod副本组成的集群实例,Service与其后端的Pod副本集群之间是通过LabelSelector来
实现关联的,而Deployment则是保证Service的服务能力和服务质量始终处于预期的标准。

通过分析,识别并建模系统中的所有服务为微服务,最终我们的系统是由多个提供不同业务能力而彼此独立
的微服务单元所组成,服务之间通过TCP/IP进行通信,从而形成了强大而又灵活的弹性网络,拥有强大的分布
式能力、弹性扩展能力、容错能力。

    1. 1 、 定义 Service
kind: Service
apiVersion: v 1
metadata:
name: test-service
namespace: default
labels:
app: test-service
spec:
type: ClusterIP
selector:
app: test-service
ports:

- port: 80
    targetPort: 80
    1. 2 、 Service 的工作方式

在Kubernetes迭代过程中,给Service设置里三种工作方式,分别是:Userspace方式、Iptables以及Ipvs,
这三种方式到现在为止,官方推荐使用IPVS, 当集群不支持IPVS的时候,集群会降级到Iptables。

      1. 1 、 Userspace

ClientPod要访问ServerPod时,它先将请求发给本机内核空间中的service规则,由它再将请求,转给监听
在指定套接字上的kube-proxy,kube-proxy处理完请求,并分发请求到指定ServerPod后,再将请求递交给内
核空间中的service,由service将请求转给指定的ServerPod。由于其需要来回在用户空间和内核空间交互通信,
因此效率很差。

      1. 2 、 Iptables模型

直接由内核中的iptables规则,接受ClientPod的请求,并处理完成后,直接转发给指定ServerPod。这
种方式不再将请求转发给kube-proxy,性能提升很多。

      1. 3 、 Ipvs模型

在 ipvs 模式下,kube-proxy监视Kubernetes服务和端点,调用netlink接口相应地创建 IPVS规则,并
定期将 IPVS规则与 Kubernetes服务和端点同步。该控制循环可确保IPVS状态与所需状态匹配。访问服务
时,IPVS 将流量定向到后端Pod之一。

IPVS代理模式基于类似于 iptables 模式的 netfilter 挂钩函数,但是使用哈希表作为基础数据结构,并且
在内核空间中工作。这意味着,与 iptables 模式下的kube-proxy相比,IPVS模式下的 kube-proxy重定向
通信的延迟要短,并且在同步代理规则时具有更好的性能。与其他代理模式相比,IPVS模式还支持更高的网络
流量吞吐量。

以上不论哪种,kube-proxy都通过watch的方式监控着kube-APIServer写入etcd中关于Pod的最新状态
信息,它一旦检查到一个Pod资源被删除了 或 新建,它将立即将这些变化,反应再iptables或 ipvs规则中,
以便iptables和ipvs在调度ClinetPod请求到ServerPod时,不会出现ServerPod不存在的情况。

自k 8 s 1. 1 以后,service默认使用ipvs规则,若ipvs没有被激活,则降级使用iptables规则. 但在 1. 1 以前,
service使用的模式默认为userspace。

    1. 3 、 Service 类型
Service是Kubernetes对外访问的窗口,针对不同的场景,kubernetes为我们设置了四种Service的类型。
      1. 1 、 ClusterIP

kubernetes默认就是这种方式,是集群内部访问的方式,外部是无法访问的。其主要用于为集群内Pod访
问时,提供的固定访问地址,默认是自动分配地址,可使用ClusterIP关键字指定固定IP。

[root@kubernetes-master- 01 test]# cat clusterip.yaml
kind: Service
apiVersion: v 1
metadata:
name: my-svc
spec:
type: ClusterIP
selector:
app: nginx
ports:

- port: 80
    targetPort: 80

[root@kubernetes-master- 01 test]# vim clusterip.yaml
[root@kubernetes-master- 01 test]# kubectl apply -f clusterip.yaml
service/my-svc created
[root@kubernetes-master- 01 test]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10. 96. 0. 1 <none> 443 /TCP 11 d
my-svc ClusterIP 10. 96. 222. 172 <none> 80 /TCP 21 s
nginx NodePort 10. 96. 6. 147 <none> 80 : 42550 /TCP 11 m
[root@kubernetes-master- 01 test]# curl 10. 96. 6. 147
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35 em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h 1 >Welcome to nginx!</h 1 >
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
        1. 1 、 HeadlessService
kubernates中还有一种service类型:headlessserivces功能,字面意思无service其实就是改service对
外无提供IP。一般用于对外提供域名服务的时候,我们在Ingress章节详讲。
kind: Service
apiVersion: v 1
metadata:
name: nginx-svc
spec:
clusterIP: None
selector:
app: test-svc
ports:
- port: 80
    targetPort: 80
    name: http
[root@kubernetes-master- 01 test]# kubectl apply -f headless-service.yaml
service/my-svc created
[root@kubernetes-master- 01 test]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10. 96. 0. 1 <none> 443 /TCP 11 d
**my-svc ClusterIP None <none> 80 /TCP 4 s**
nginx NodePort 10. 96. 6. 147 <none> 80 : 42550 /TCP 30 m
      1. 2 、 NodePort
NodePort是将主机IP和端口跟kubernetes集群所需要暴露的IP和端口进行关联,方便其对外提供服务。
内部可以通过ClusterIP进行访问,外部用户可以通过NodeIP:NodePort的方式单独访问每个Node上的实例。
[root@kubernetes-master- 01 test]# kubectl apply -f nodeport.yaml
service/my-svc created
[root@kubernetes-master- 01 test]# cat nodeport.yaml
kind: Service
apiVersion: v 1
metadata:
name: my-svc
spec:
type: NodePort
selector:
app: nginx
ports:
- port: 80
targetPort: 80
nodePort: 30080

[root@kubernetes-master- 01 test]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10. 96. 0. 1 <none> 443 /TCP 11 d
my-svc NodePort 10. 96. 159. 234 <none> 80 : 30080 /TCP 12 s
nginx NodePort 10. 96. 6. 147 <none> 80 : 42550 /TCP 17 m
[root@kubernetes-master- 01 test]# curl 192. 168. 12. 71 : 30080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35 em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h 1 >Welcome to nginx!</h 1 >
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
      1. 3 、 LoadBalancer
LoadBalancer类型的service 是可以实现集群外部访问服务的另外一种解决方案。不过并不是所有的k 8 s
集群都会支持,大多是在公有云托管集群中会支持该类型。负载均衡器是异步创建的,关于被提供的负载均衡器
的信息将会通过Service的status.loadBalancer字段被发布出去。
[root@kubernetes-master- 01 ~]# cat > svc.yaml <<EOF
apiVersion: v 1
kind: Service
metadata:
name: loadbalancer
spec:
type: LoadBalancer
ports:

- port: 80
    targetPort: 80
selector:
app: nginx
EOF
[root@kubernetes-node- 01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10. 0. 0. 1 <none> 443 /TCP 110 d
loadbalancer LoadBalancer 10. 0. 129. 18 81. 71. 12. 240 80 : 30346 /TCP 11 s
      1. 4 、 ExternalName

ExternalNameService是Service的一个特例,它没有选择器,也没有定义任何端口或Endpoints。它的作
用是返回集群外Service的外部别名。它将外部地址经过集群内部的再一次封装(实际上就是集群DNS服务器将
CNAME解析到了外部地址上),实现了集群内部访问即可。例如你们公司的镜像仓库,最开始是用ip访问,等
到后面域名下来了再使用域名访问。你不可能去修改每处的引用。但是可以创建一个ExternalName,首先指向
到ip,等后面再指向到域名。

kind: Service
apiVersion: v 1
metadata:
name: my-svc
spec:
type: ExternalName
externalName: [http://www.baidu.com](http://www.baidu.com)
  1. 6 、 deployment资源

Deployment为Pod提供声明式更新。在Deployment对象中描述所需的状态,然后Deployment控制器将
实际状态以受控的速率更改为所需的状态。您可以定义部署以创建新的副本集,或删除现有部署并在新部署中采
用其所有资源。一句话:Deployment主要功能是保证有足够的Pod正常对外提供服务。

    1. 1 、 创建 Depoyment
apiVersion: apps/v 1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:

- name: nginx
    image: nginx
    ports:
       - containerPort: 80

1. 6. 1. 1 、 参数示意

nginx-deployment:Deployment的名称。
replicas: 创建Pod的副本数。
selector:定义Deployment如何找到要管理的Pod,与template的label(标签)对应。
template字段包含以下字段:
app: nginx使用label(标签)标记Pod
spec:表示Pod运行一个名字为nginx的容器。
image:运行此Pod使用的镜像
Port:容器用于发送和接收流量的端口

1. 6. 1. 2 、 执行创建命令

[root@k-master- 01 ~]# kubectl apply -f demo.yaml
deployment.apps/nginx-deployment created
[root@k-master- 01 ~]# kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 0 / 3 0 0 1 s

1. 6. 1. 3 、 注意

将kubectl标志设置--record为true允许您将当前命令记录在正在创建或更新的资源的注释中。这对于将来
的检查很有用。
[root@kubernetes-master- 01 test]# kubectl apply -f deployment.yaml --record
deployment.apps/nginx-deployment configured
[root@kubernetes-master- 01 test]# kubectl rollout history deployment
nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 kubectl apply --filename=deployment.yaml --record=true

1. 6. 2 、 查看部署状态

[root@kubernetes-master- 01 test]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-d 46 f 5678 b- 6458 k 1 / 1 Running 0 3 m 28 s
nginx-deployment-d 46 f 5678 b-hc 4 fc 1 / 1 Running 0 3 m 28 s
nginx-deployment-d 46 f 5678 b-k 7 gcg 1 / 1 Running 0 3 m 28 s

1. 6. 3 、 查看部署详情

[root@kubernetes-master- 01 test]# kubectl describe deployments.apps
nginx-deployment
Name: nginx-deployment
Namespace: default
CreationTimestamp: Fri, 27 Nov 2020 17 : 14 : 56 + 0800
Labels: app=nginx
Annotations: deployment.kubernetes.io/revision: 1
kubernetes.io/change-cause: kubectl apply

- -filename=deployment.yaml --record=true
Selector: app=nginx
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25 % max unavailable, 25 % max surge
Pod Template:
Labels: app=nginx
Containers:
nginx:
Image: nginx
Port: 80 /TCP
Host Port: 0 /TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason

- --- ------ ------
Progressing True NewReplicaSetAvailable
Available True MinimumReplicasAvailable
OldReplicaSets: <none>
NewReplicaSet: nginx-deployment-d 46 f 5678 b ( 3 / 3 replicas created)
Events:
Type Reason Age From Message
- --- ------ ---- ---- -------
Normal ScalingReplicaSet 7 m 3 s deployment-controller Scaled up replica set
nginx-deployment-d 46 f 5678 b to 3

1. 6. 4 、 更新

一般对应用程序升级或者版本迭代时,会通过Deployment对Pod进行滚动更新。

1. 6. 4. 1 、 设置

[root@kubernetes-master- 01 test]# kubectl set image deployment nginx-deployment
nginx=nginx: 1. 18. 0
deployment.apps/nginx-deployment image updated

看到后端Pod已经开始更新了

[root@kubernetes-master- 01 test]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment- 567 bfc 79 bb-rs 59 t 0 / 1 ContainerCreating 0 18 s
nginx-deployment-d 46 f 5678 b- 6458 k 1 / 1 Running 0 9 m 54 s
nginx-deployment-d 46 f 5678 b-hc 4 fc 1 / 1 Running 0 9 m 54 s
nginx-deployment-d 46 f 5678 b-k 7 gcg 1 / 1 Running 0 9 m 54 s

1. 6. 4. 2 、 修改

[root@kubernetes-master- 01 test]# kubectl edit deployments.apps nginx-deployment
deployment.apps/nginx-deployment edited
[root@kubernetes-master- 01 test]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment- 567 bfc 79 bb- 9 ztk 6 1 / 1 Running 0 85 s
nginx-deployment- 567 bfc 79 bb-rs 59 t 1 / 1 Running 0 109 s
nginx-deployment- 567 bfc 79 bb-z 8 wmk 1 / 1 Running 0 61 s
nginx-deployment- 7 c 97 c 6 df 7 b-pm 42 c 0 / 1 ContainerCreating 0 11 s

1. 6. 4. 3 、 查看更新状态

[root@kubernetes-master- 01 test]#kubectlrolloutstatusdeploymentnginx-deployment
Waitingfordeployment"nginx-deployment"rollouttofinish: 2 outof 3 newreplicas
have been updated...
Waitingfordeployment"nginx-deployment"rollouttofinish: 2 outof 3 newreplicas
have been updated...
Waitingfordeployment"nginx-deployment"rollouttofinish: 2 outof 3 newreplicas
have been updated...
Waitingfordeployment"nginx-deployment"rollouttofinish: 1 oldreplicasarepending
termination...
Waitingfordeployment"nginx-deployment"rollouttofinish: 1 oldreplicasarepending
termination...
deployment "nginx-deployment" successfully rolled out

1. 6. 5 、 回滚

当新版本不稳定时,可以对其进行回滚操作,默认情况下,所有Deployment的rollout历史都保留在系统
中,可以随时回滚。

1. 6. 5. 1 、 查看构建历史

[root@kubernetes-master- 01 test]# kubectl rollout history deployment
nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 kubectl apply --filename=deployment.yaml --record=true
2 kubectl apply --filename=deployment.yaml --record=true
3 kubectl apply --filename=deployment.yaml --record=true

1. 6. 5. 2 、 回滚到上一个版本

## # 查看当前构建历史

[root@kubernetes-master- 01 test]# kubectl rollout history deployment
nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 kubectl apply --filename=deployment.yaml --record=true
2 kubectl apply --filename=deployment.yaml --record=true
3 kubectl apply --filename=deployment.yaml --record=true

# 开始回滚
[root@kubernetes-master- 01 test]# **kubectl rolloutundo deployment nginx-deployment**
deployment.apps/nginx-deployment rolled back

# 查看构建状态
[root@kubernetes-master- 01 test]#kubectlrolloutstatusdeploymentnginx-deployment
Waitingfordeployment"nginx-deployment"rollouttofinish: 1 outof 3 newreplicas
have been updated...
Waitingfordeployment"nginx-deployment"rollouttofinish: 1 outof 3 newreplicas
have been updated...
Waitingfordeployment"nginx-deployment"rollouttofinish: 1 outof 3 newreplicas
have been updated...
Waitingfordeployment"nginx-deployment"rollouttofinish: 2 outof 3 newreplicas
have been updated...
Waitingfordeployment"nginx-deployment"rollouttofinish: 2 outof 3 newreplicas
have been updated...
Waitingfordeployment"nginx-deployment"rollouttofinish: 2 outof 3 newreplicas
have been updated...
Waitingfordeployment"nginx-deployment"rollouttofinish: 1 oldreplicasarepending
termination...
Waitingfordeployment"nginx-deployment"rollouttofinish: 1 oldreplicasarepending
termination...
Waitingfordeployment"nginx-deployment"rollouttofinish: 1 oldreplicasarepending
termination...
Waitingfordeployment"nginx-deployment"rollouttofinish: 1 oldreplicasarepending
termination...
deployment "nginx-deployment" successfully rolled out

# 查看新的构建历史, 发现历史 2 被删除,新增了历史 4
[root@kubernetes-master- 01 test]# kubectl rollout history deployment
nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 kubectl apply --filename=deployment.yaml --record=true
3 kubectl apply --filename=deployment.yaml --record=true
4 kubectl apply --filename=deployment.yaml --record=true

1. 6. 5. 3 、 回滚指定版本

## # 查看当前历史版本

[root@kubernetes-master- 01 test]# kubectl rollout history deployment
nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 kubectl apply --filename=deployment.yaml --record=true
3 kubectl apply --filename=deployment.yaml --record=true
4 kubectl apply --filename=deployment.yaml --record=true

# 回滚至指定版本
[root@kubernetes-master- 01 test]# kubectl rolloutundo deploymentnginx-deployment

- -to-revision= 1
deployment.apps/nginx-deployment rolled back

# 查看回滚状态
[root@kubernetes-master- 01 test]#kubectlrolloutstatusdeploymentnginx-deployment
Waitingfordeployment"nginx-deployment"rollouttofinish: 1 outof 3 newreplicas
have been updated...
Waitingfordeployment"nginx-deployment"rollouttofinish: 1 outof 3 newreplicas
have been updated...
Waitingfordeployment"nginx-deployment"rollouttofinish: 1 outof 3 newreplicas
have been updated...
Waitingfordeployment"nginx-deployment"rollouttofinish: 2 outof 3 newreplicas
have been updated...
Waitingfordeployment"nginx-deployment"rollouttofinish: 2 outof 3 newreplicas
have been updated...
Waitingfordeployment"nginx-deployment"rollouttofinish: 2 outof 3 newreplicas
have been updated...
Waitingfordeployment"nginx-deployment"rollouttofinish: 1 oldreplicasarepending
termination...
Waitingfordeployment"nginx-deployment"rollouttofinish: 1 oldreplicasarepending
termination...
deployment "nginx-deployment" successfully rolled out

# 查看deployment详细信息
[root@kubernetes-master- 01 test]# kubectl describe deployments.apps
nginx-deployment
Name: nginx-deployment
Namespace: default
CreationTimestamp: Fri, 27 Nov 2020 17 : 14 : 56 + 0800
Labels: app=nginx
Annotations: deployment.kubernetes.io/revision: 5
kubernetes.io/change-cause: kubectl apply

- -filename=deployment.yaml --record=true
Selector: app=nginx
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25 % max unavailable, 25 % max surge
Pod Template:
    Labels: app=nginx
    Containers:
       nginx:
          Image: nginx
          Port: 80 /TCP
          Host Port: 0 /TCP
          Environment: <none>
          Mounts: <none>
    Volumes: <none>
Conditions:
    Type Status Reason
    - --- ------ ------
    Progressing True NewReplicaSetAvailable
    Available True MinimumReplicasAvailable
OldReplicaSets: <none>
NewReplicaSet: nginx-deployment-d 46 f 5678 b ( 3 / 3 replicas created)
Events:
    Type Reason Age From Message
    - --- ------ ---- ---- -------
    Normal ScalingReplicaSet 11 m deployment-controller Scaled up
replica set nginx-deployment- 567 bfc 79 bb to 1
Normal ScalingReplicaSet 11 m deployment-controller Scaled down
replica set nginx-deployment-d 46 f 5678 b to 2
Normal ScalingReplicaSet 10 m deployment-controller Scaled down
replica set nginx-deployment-d 46 f 5678 b to 1
Normal ScalingReplicaSet 10 m deployment-controller Scaled up
replica set nginx-deployment- 567 bfc 79 bb to 3
Normal ScalingReplicaSet 10 m deployment-controller Scaled down
replica set nginx-deployment-d 46 f 5678 b to 0
Normal ScalingReplicaSet 10 m deployment-controller Scaled up
replica set nginx-deployment- 7 c 97 c 6 df 7 b to 1
Normal ScalingReplicaSet 5 m 35 s (x 2 over 11 m) deployment-controller Scaled up
replica set nginx-deployment- 567 bfc 79 bb to 2
Normal ScalingReplicaSet 103 s (x 2 over 9 m 33 s) deployment-controller Scaled
down replica set nginx-deployment- 567 bfc 79 bb to 2
Normal ScalingReplicaSet 85 s (x 2 over 21 m) deployment-controller Scaled up
replica set nginx-deployment-d 46 f 5678 b to 3
Normal ScalingReplicaSet 85 s deployment-controller Scaled down
replica set nginx-deployment- 567 bfc 79 bb to 1
Normal ScalingReplicaSet 68 s(x 12 over 9 m 33 s) deployment-controller (combined
from similar events): Scaled down replica set nginx-deployment- 567 bfc 79 bb to 0

1. 6. 6 、 扩容

## 当业务的用户越来越多,目前的后端服务已经无法满足业务要求当前的业务要求,传统的解决办法是将其横

## 向增加服务器,从而满足我们的业务要求。K 8 S中也是支持横向扩容的方法的。

# 第一种方式:scale
[root@instance-gvpb 80 ao yaml]# kubectl scale deployment nginx-deployment

- -replicas= 5
deployment.apps/nginx-deployment scaled
[root@instance-gvpb 80 ao yaml]# kubectl get -f deployment.yaml
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 4 / 5 5 4 31 m

# 第二种方式: Patch
[root@kubernetes-master- 01 test]# kubectl patch deployments.apps nginx-deployment

- p '{"spec": {"replicas": 5 }}'
deployment.apps/nginx-deployment patched
[root@kubernetes-master- 01 test]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-d 46 f 5678 b- 2 k 6 sv 0 / 1 ContainerCreating 0 5 s
nginx-deployment-d 46 f 5678 b- 4 c 2 pk 1 / 1 Running 0 10 m
nginx-deployment-d 46 f 5678 b-mbzs 8 1 / 1 Running 0 9 m 48 s
nginx-deployment-d 46 f 5678 b-rd 5 hm 0 / 1 ContainerCreating 0 5 s
nginx-deployment-d 46 f 5678 b-swjdn 1 / 1 Running 0 10 m

1. 6. 7 、 暂停部署

## # 暂停部署

[root@kubernetes-master- 01 test]#kubectlrolloutpausedeploymentnginx-deployment
error: deployments.apps "nginx-deployment" is already paused

# 设置镜像升级
[root@kubernetes-master- 01 test]# kubectl set image deployment nginx-deployment
nginx=nginx: 1. 16. 0
deployment.apps/nginx-deployment image updated

# 查看部署状态,发现没有开始部署
[root@kubernetes-master- 01 test]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-d 46 f 5678 b- 2 k 6 sv 1 / 1 Running 0 7 m 33 s
nginx-deployment-d 46 f 5678 b- 4 c 2 pk 1 / 1 Running 0 17 m
nginx-deployment-d 46 f 5678 b-mbzs 8 1 / 1 Running 0 17 m
nginx-deployment-d 46 f 5678 b-nwzwf 1 / 1 Running 0 6 m 11 s
nginx-deployment-d 46 f 5678 b-p 8 kwv 1 / 1 Running 0 6 m 11 s
nginx-deployment-d 46 f 5678 b-rd 5 hm 1 / 1 Running 0 7 m 33 s
nginx-deployment-d 46 f 5678 b-sklzt 1 / 1 Running 0 6 m 11 s
nginx-deployment-d 46 f 5678 b-swjdn 1 / 1 Running 0 18 m
nginx-deployment-d 46 f 5678 b-tmhch 1 / 1 Running 0 6 m 11 s
nginx-deployment-d 46 f 5678 b-wwmbk 1 / 1 Running 0 6 m 11 s

# 取消暂停,开始部署
[root@kubernetes-master- 01 test]#kubectlrolloutresumedeploymentnginx-deployment
deployment.apps/nginx-deployment resumed

# 查看状态,发现开始部署
[root@kubernetes-master- 01 test]# kubectl get pods
NAME READY STATUS RESTARTS AGE
**nginx-deployment- 7 c 97 c 6 df 7 b- 45 dch 0 / 1 ContainerCreating 0 2 s
nginx-deployment- 7 c 97 c 6 df 7 b- 7 sm 7 l 0 / 1 ContainerCreating 0 2 s
nginx-deployment- 7 c 97 c 6 df 7 b- 9 c 68 n 0 / 1 ContainerCreating 0 2 s
nginx-deployment- 7 c 97 c 6 df 7 b-mgh 4 t 0 / 1 ContainerCreating 0 2 s
nginx-deployment- 7 c 97 c 6 df 7 b-nkxqd 0 / 1 ContainerCreating 0 2 s**
nginx-deployment-d 46 f 5678 b- 2 k 6 sv 1 / 1 Running 0 8 m 4 s
nginx-deployment-d 46 f 5678 b- 4 c 2 pk 1 / 1 Running 0 18 m
nginx-deployment-d 46 f 5678 b-mbzs 8 1 / 1 Running 0 17 m
nginx-deployment-d 46 f 5678 b-nwzwf 0 / 1 Terminating 0 6 m 42 s
nginx-deployment-d 46 f 5678 b-p 8 kwv 1 / 1 Running 0 6 m 42 s
nginx-deployment-d 46 f 5678 b-rd 5 hm 1 / 1 Running 0 8 m 4 s
nginx-deployment-d 46 f 5678 b-sklzt 1 / 1 Running 0 6 m 42 s
nginx-deployment-d 46 f 5678 b-swjdn 1 / 1 Running 0 18 m
nginx-deployment-d 46 f 5678 b-tmhch 1 / 1 Running 0 6 m 42 s
nginx-deployment-d 46 f 5678 b-wwmbk 1 / 1 Terminating 0 6 m 42 s
posted @ 2020-08-23 12:08  看萝卜在飘  阅读(374)  评论(0编辑  收藏  举报