目录

1、架构简介:

2、集群架构图:

3、集群服务器:

4、修改主机名称:

5、修改hosts配置文件:

6、关闭selinux:

7、关闭防火墙:

8、关闭swap:

9、设置iptables网桥:

10、软件k8s/docker/dashboard版本:

11、安装docker环境:

(1)在线安装docker:

① 卸载旧版本docker:

② 安装依赖:

③ 配置存储仓库:

④ 安装docker:

(2)离线rpm安装docker:

① 获取离线包:

② 上传离线包:

③ 执行安装包:

④ 编写docker服务脚本:

⑤ 上传服务脚本及授权:

⑥ 重新加载系统服务:

(3)操作docker服务:

① 开机自启docker服务:

② 启动docker服务:

(4)修改docker的Cgroup Driver:

(5)重新启动docker:

12、安装kubeadm/kubelet/kubectl:

(1)简介:

(2)官网安装教程:

(3)在线安装:

① 添加阿里云YUM的软件源:

② 安装安装kubeadm/kubelet/kubectl:

(4)离线安装:

① 安装crictl:

② 获取kubeadm/kubelet/kubectl离线包:

③ 上传kubeadm/kubelet/kubectl离线包:

④ 执行安装包:

⑤ 编写kubelet服务脚本:

⑥ 上传服务脚本及授权:

⑦ 重新加载系统服务:

(5)操作kubelet服务:

① 开启自启kubelet服务:

13、集群k8s所需镜像和软件版本:

14、配置nginx负载均衡:

(1)在线安装nginx:

① 安装依赖:

② 下载软件包:

③ 上传软件包:

④ 解压软件包:

⑤ 监测configure:

⑥ 编译make:

⑦ 安装make install:

⑧ 编写nginx服务脚本:

⑨ 上传服务脚本及授权:

⑩ 重新加载系统服务:

(2)离线安装nginx:

① 下载nginx的rpm包:

② 上传rpm包到服务器:

③ 执行rpm安装命令:

④ 修改nginx.conf配置文件:

⑤ 编写nginx服务脚本:

⑥ 上传服务脚本及授权:

⑦ 重新加载系统服务:

(3)配置master节点负载均衡:

(4)操作nginx服务:

① 开机自启nginx服务:

② 启动nginx服务:

15、部署k8s的首个master:

(1)在线安装:

(2)离线安装:

① 下载k8s镜像:

② 导出镜像:

③ 导入镜像:

④ 检查镜像列表:

⑤ 部署master节点:

⑥ 查看部署结果:

(3)生成kubelet环境配置文件:

16、安装pod网络插件(CNI):

(1)下载flannel的yml配置文件:

(2)上传yml配置文件:

(3)拉取flannel镜像:

(4)重命名flannel镜像:

(5)删除旧flannel镜像:

(6)生效yml配置文件:

17、加入k8s其它master:

(1)查看token信息:

① 查询token值:

② 新建token:

③ 查询discovery-token-ca-cert-hash值:

④ 新建certificate-key值:

(2)在线加入:

(3)离线加入:

① 下载k8s镜像:

② 导出镜像:

③ 导入镜像:

④ 检查镜像列表:

⑤ 加入k8s集群:

⑥ 查看部署结果:

(4)生成kubelet环境配置文件:

18、加入k8s的node:

(1)如果是离线加入需要操作:

① 拉取kube-proxy镜像:

(2)拉取flannel镜像:

(3)重命名flannel镜像:

(4)删除旧flannel镜像:

(5)向集群添加新节点:

① 查询token值:

② 新建token:

③ 查询discovery-token-ca-cert-hash值:

④ 添加新节点到集群:

⑤ 查看node列表:

(6)安装pod网络插件(CNI):

(7)查看node列表:

19、测试验证k8s集群:

(1)拉取nginx镜像:

(2)创建nginx容器:

(3)暴露对外端口:

(4)查询nginx是否运行成功:

(5)浏览器测试访问:

(6)扩展nginx副本:

(7)查看pod:


1、架构简介:

一个K8S集群由两部分构成 master节点和node节点。master节点主要负责集群的控制,对pod进行调度,已经令牌管理等等功能。node节点主要是负责干活,启动容器、管理容器。master节点和node节点一般不要部署在一台机器上。实际生产上,从高可用考虑,是需要部署多个master节点的。将这张图抽象一下,大约是这个样子:

2、集群架构图:

Kubernetes高可用集群架构图如下:

说明:本地搭建未使用keepalived,只采用一个nginx进行负载均衡请求到master节点。本次搭建采用的架构图如下:

3、集群服务器:

本地搭建kubernetes集群采用4台虚拟机,三台为master,一台为node。

集群角色

主机名称

IP地址

CPU/内存

软件

master

k8s-master-01

192.168.137.129

VIP:192.168.137.200

2核/2GB

Docker

Kubelet

Etcd

kube-apiserver

kube-controller-manager

kube-scheduler

master

k8s-master-02

192.168.137.130

VIP:192.168.137.200

2核/2GB

Docker

Kubelet

Etcd

kube-apiserver

kube-controller-manager

kube-scheduler

master

k8s-master-03

192.168.137.131

VIP:192.168.137.200

2核/2GB

Docker

Kubelet

Etcd

kube-apiserver

kube-controller-manager

kube-scheduler

node

k8s-node-01

192.168.137.132

2核/2GB

Docker

Kubelet

kube-proxy

Flannel

注意:master节点所在的服务器最低是2核的,不然安装会报错。

4、修改主机名称:

说明:在集群中所有服务器,均需要如下操作:

修改/etc/hostname文件,修改对应的名称为主机名称。

然后重新启动服务器。

5、修改hosts配置文件:

说明:在集群中所有服务器,均需要如下操作:

修改/etc/hosts文件添加主机名与IP映射关系:

6、关闭selinux:

说明:在集群中所有服务器,均需要如下操作:

修改/etc/selinux/config文件中SELINUX=的值为:disabled,然后重新启动服务器:

7、关闭防火墙:

说明:在集群中所有服务器,均需要如下操作:

执行以下命令:

关闭防火墙:

systemctl stop firewalld.service

关闭防火墙自启:

systemctl disable firewalld.service

8、关闭swap:

说明:在集群中所有服务器,均需要如下操作:

编辑/etc/fstab配置文件,将包含swap的行使用#进行注释,然后保存配置文件。最后重新启动服务器。

9、设置iptables网桥:

说明:在集群中所有服务器,均需要如下操作:

执行命令:

cat > /etc/sysctl.d/k8s.conf << EOF

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

EOF

执行命令:

sysctl --system

10、软件k8s/docker/dashboard版本:

软件k8s、docker、dashboard在版本上有一定的兼容关系:

K8s版本

Docker版本

Dashboard版本

V1.22

兼容最新到V20.10

暂时没有找到版本

V1.21

兼容最新到V20.10

V2.3.1/V2.3.0

V1.20

有变化暂未懂,应该与V1.17相同

V2.3.1/V2.3.0/V2.2.0/V2.1.0

V1.19

有变化暂未懂,应该与V1.17相同

V2.0.5/V2.0.4

V1.18

咱无明确说明,应该与V1.17相同

V2.0.3/V2.0.2/V2.0.1/V2.0.0

V1.17

V1.13.1/V17.03/V17.06/V17.09/

V18.06/V18.09/V19.03

V2.0.0-rc7/V2.0.0-rc6/V2.0.0-rc5/V2.0.0-rc4

V1.16

V1.13.1/V17.03/V17.06/V17.09/

V18.06/V18.09

V2.0.0-rc3/V2.0.0-rc2/V2.0.0-rc1/

V2.0.0-beta8/V2.0.0-beta7/V2.0.0-beta6/

V2.0.0-beta5

V1.15

V1.13.1/V17.03/V17.06/V17.09/

V18.06/V18.09

V2.0.0-beta4/V2.0.0-beta3/V2.0.0-beta2

V1.14

V1.13.1/V17.03/V17.06/V17.09/

V18.06/V18.09

V2.0.0-beta1

V1.13

V1.11.1/V1.12.1/V1.13.1/

V17.03/V17.06/V17.09/V18.06

暂时没有找到版本

V1.12

V1.11.1/V1.12.1/V1.13.1/

V17.03/V17.06/V17.09/V18.06

暂时没有找到版本

V1.11

V1.11.x/V1.12.x/V1.13.x/V17.03.x

暂时没有找到版本

V1.10

V1.11.x/V1.12.x/V1.13.x/V17.03.x

V1.10.1/V1.10.0

V1.9

V1.11.x/V1.12.x/V1.13.x/V17.03.x

V1.10.1/V1.10.0/V1.8.3

V1.8

V1.11.2/V1.12.6/V1.13.1/V17.03.2

V1.10.1/V1.10.0/V1.8.3

查看k8s与docker版本兼容关系操作步骤:

本次搭建的k8s为1.17.0,对应的docker版本需要1.13.1、17.03、17.06、 17.09、 18.06、18.09。本地安装的docker版本为:18.06.1。

软件k8s的github地址:https://github.com/kubernetes/kubernetes,通过CHANGELOG,点击低版本的log,比如:14、15等,搜索:docker version,可以查看到当前k8s版本兼容的docker版本。

查看k8s与dashboard版本兼容关系操作步骤:

注意查看k8s兼容的dashboard版本。本次搭建的k8s版本为1.17.0,通过查看dashboard官网上不同版本的dashboard软件包能够兼容的对应k8s版本,查找到对应的dashboard版本,本次dashboard版本使用的是v2.0.0-rc7。

官网dashboard地址:https://github.com/kubernetes/dashboard/releases

11、安装docker环境:

说明:在集群中所有服务器,均需要如下操作:

(1)在线安装docker:

本地安装的docker版本为:18.06.1。

① 卸载旧版本docker:

执行命令:

yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine

② 安装依赖:

执行命令:

yum install -y yum-utils device-mapper-persistent-data lvm2

③ 配置存储仓库:

执行命令:

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

④ 安装docker:

在线安装的命令为:

yum -y install docker-ce-18.06.1.ce-3.el7

(2)离线rpm安装docker:

在一个有网,并且没安装过docker的服务器上执行yum命令,将需要的相关rpm格式安装包下载到服务器指定文件夹中,以便在无网服务器中安装:

① 获取离线包:

创建rpm软件存储目录:

mkdir -p /wocloud/soft/docker_rpm

安装依赖rpm包:

yum install -y yum-utils device-mapper-persistent-data lvm2

配置存储仓库:

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

获取docker的rpm包:

yum -y install docker-ce-18.06.1.ce-3.el7 --downloadonly --downloaddir /wocloud/soft/docker_rpm

其它无网服务器需要安装时,将/wocloud/soft/docker_rpm中的所有rpm文件压缩到一个包中,然后上传到目标服务器,执行下面安装命令即可。

② 上传离线包:

将获取的docker的rpm离线包上传到目标服务器。

③ 执行安装包:

进入到docker的rpm离线包的文件夹中,执行如下安装命令:

执行命令:

rpm -ivh *.rpm --force --nodeps

④ 编写docker服务脚本:

编写docker.service服务文件;

[Unit]

Description=Docker Application Container Engine

Documentation=https://docs.docker.com

After=network-online.target firewalld.service

Wants=network-online.target



[Service]

Type=notify

# the default is not to use systemd for cgroups because the delegate issues still

# exists and systemd currently does not support the cgroup feature set required

# for containers run by docker

ExecStart=/usr/bin/dockerd

ExecReload=/bin/kill -s HUP $MAINPID

# Having non-zero Limit*s causes performance problems due to accounting overhead

# in the kernel. We recommend using cgroups to do container-local accounting.

LimitNOFILE=infinity

LimitNPROC=infinity

LimitCORE=infinity

# Uncomment TasksMax if your systemd version supports it.

# Only systemd 226 and above support this version.

#TasksMax=infinity

TimeoutStartSec=0

# set delegate yes so that systemd does not reset the cgroups of docker containers

Delegate=yes

# kill only the docker process, not all processes in the cgroup

KillMode=process

# restart the docker process if it exits prematurely

Restart=on-failure

StartLimitBurst=3

StartLimitInterval=60s



[Install]

WantedBy=multi-user.target

⑤ 上传服务脚本及授权:

将docker.service文件上传到服务器/etc/systemd/system/中,并授权:

chmod 777 /etc/systemd/system/docker.service

⑥ 重新加载系统服务:

执行命令:

systemctl daemon-reload

(3)操作docker服务:

① 开机自启docker服务:

执行命令:

systemctl enable docker

② 启动docker服务:

执行命令:

systemctl start docker

(4)修改docker的Cgroup Driver:

执行命令:

cat > /etc/docker/daemon.json <<EOF

{

 "exec-opts": ["native.cgroupdriver=systemd"]

}

EOF

(5)重新启动docker:

执行命令:

systemctl daemon-reload

执行命令:

systemctl restart docker.service

12、安装kubeadm/kubelet/kubectl:

说明:在集群中所有服务器,均需要如下操作:

(1)简介:

Kubeadm:用来初始化集群的指令。

Kubelet:在集群中的每个节点上用来启动Pod和容器等。

Kubectl:用来与集群通信的命令行工具。

kubeadm不能帮你安装或者管理kubelet或kubectl,所以你需要 确保它们与通过kubeadm安装的控制平面的版本相匹配。 如果不这样做,则存在发生版本偏差的风险,可能会导致一些预料之外的错误和问题。 然而,控制平面与kubelet间的相差一个次要版本不一致是支持的,但 kubelet 的版本不可以超过API服务器的版本。 例如,1.7.0版本的kubelet可以完全兼容1.8.0版本的API服务器,反之则不可以。

(2)官网安装教程:

官网安装教程地址:https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

(3)在线安装:

① 添加阿里云YUM的软件源:

执行命令:

cat > /etc/yum.repos.d/kubernetes.repo << EOF

[kubernetes]

name=Kubernetes

baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64

enabled=1

gpgcheck=0

repo_gpgcheck=0

gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

EOF

② 安装安装kubeadm/kubelet/kubectl:

执行命令:

yum install -y kubelet-1.17.0 kubeadm-1.17.0 kubectl-1.17.0

(4)离线安装:

① 安装crictl:

软件crictl是kubeadm/kubelet容器运行时接口(CRI)所需的。

软件下载:下载V1.17.0版本的crictl,与k8s版本一致,下载地址为:https://github.com/kubernetes-sigs/cri-tools/releases

软件上传:将下载的crictl软件包上传到服务器的自定义文件夹中。

软件解压:将crictl软件包进行解压。

文件移动:将crictl软件解压的crictl文件移动到/usr/bin中。

② 获取kubeadm/kubelet/kubectl离线包:

在一个有网,并且没安装过k8s的服务器上执行yum命令,将需要的相关rpm格式安装包下载到服务器指定文件夹中,以便在无网服务器中安装:

添加阿里云YUM的软件源:

执行命令:

cat > /etc/yum.repos.d/kubernetes.repo << EOF

[kubernetes]

name=Kubernetes

baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64

enabled=1

gpgcheck=0

repo_gpgcheck=0

gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

EOF

下载离线安装包:

创建rpm软件存储目录:

mkdir -p /wocloud/soft/kubeadm

执行命令:

yum install -y kubelet-1.17.0 kubeadm-1.17.0 kubectl-1.17.0 --downloadonly --downloaddir /wocloud/soft/kubeadm

其它无网服务器需要安装时,将/wocloud/soft/kubeadm中的所有rpm文件压缩到一个包中,然后上传到目标服务器,执行下面安装命令即可。

③ 上传kubeadm/kubelet/kubectl离线包:

将获取的kubeadm/kubelet/kubectl离线包上传到目标服务器。

④ 执行安装包:

进入到kubeadm/kubelet/kubectl离线包的文件夹中,执行如下安装命令:

执行命令:

rpm -ivh *.rpm --force --nodeps

⑤ 编写kubelet服务脚本:

编写kubelet.service服务文件;

[Unit]

Description=kubelet: The Kubernetes Node Agent

Documentation=https://kubernetes.io/docs/



[Service]

ExecStart=/usr/bin/kubelet

Restart=always

StartLimitInterval=0

RestartSec=10



[Install]

WantedBy=multi-user.target

⑥ 上传服务脚本及授权:

将kubelet.service文件上传到服务器/etc/systemd/system/中,并授权:

chmod 777 /etc/systemd/system/kubelet.service

⑦ 重新加载系统服务:

执行命令:

systemctl daemon-reload

(5)操作kubelet服务:

① 开启自启kubelet服务:

执行命令:systemctl enable kubelet

13、集群k8s所需镜像和软件版本:

通过kubeadm搭建k8s集群所需要的相关镜像和软件,与k8s版本有对应的兼容关系,查看不同版本的k8s所需要的镜像和软件版本如下操作:

软件k8s的github地址:https://github.com/kubernetes/kubernetes,通过CHANGELOG,点击低版本的log,比如:17、18等,搜索:coredns、etcd等关键词,可以查看到当前k8s版本兼容的对应镜像版本。

K8s

版本

Coredns版本

Etcd

版本

api

版本

controller

版本

proxy

版本

scheduler

版本

Pause

版本

Cri-ctl

版本

V1.22

V1.8.4

V3.5.0

V1.22.0

V1.22.0

V1.22.0

V1.22.0

V3.5

V1.21.0

V1.21

V1.8.0

V3.4.13

V1.21.0

V1.21.0

V1.21.0

V1.21.0

V3.4.1

V1.20.0

V1.20

V1.7.0

V3.4.13

V1.20.0

V1.20.0

V1.20.0

V1.20.0

V3.4

V1.19.0

V1.19

V1.7.0

V3.4.9

V1.19.0

V1.19.0

V1.19.0

V1.19.0

V3.2

V1.18.0

V1.18

V1.6.7

V3.4.3

V1.18.0

V1.18.0

V1.18.0

V1.18.0

V3.2

V1.17.0

V1.17

V1.6.5

V3.4.3

V1.17.0

V1.17.0

V1.17.0

V1.17.0

V3.1

V1.17.0

V1.16

V1.6.2

V3.3.15

V1.16.0

V1.16.0

V1.16.0

V1.16.0

——

V1.14.0

V1.15

V1.3.1

V3.3.10

V1.15.0

V1.15.0

V1.15.0

V1.15.0

——

V1.14.0

V1.14

V1.3.1

V3.3.10

V1.14.0

V1.14.0

V1.14.0

V1.14.0

——

——

V1.13

V1.2.6

V3.2.24

V1.13.0

V1.13.0

V1.13.0

V1.13.0

——

——

V1.12

V1.2.2

V3.2.24

V1.12.0

V1.12.0

V1.12.0

V1.12.0

——

——

V1.11

V1.1.3

V3.2.18

V1.11.0

V1.11.0

V1.11.0

V1.11.0

——

——

V1.10

——

V3.1.12

V1.10.0

V1.10.0

V1.10.0

V1.10.0

V3.1

——

V1.9

——

V3.1.10

V1.9.0

V1.9.0

V1.9.0

V1.9.0

——

V1.0.0

V1.8

——

——

V1.8.0

V1.8.0

V1.8.0

V1.8.0

——

V1.0.0

14、配置nginx负载均衡:

说明:本地搭建未使用keepalived,只在k8s-master-01采用一个nginx进行负载均衡请求到master节点。

说明:在集群中k8s-master-01服务器上进行如下操作:

(1)在线安装nginx:

① 安装依赖:

安装gcc依赖:

yum -y install gcc

安装pcre-devel依赖:

yum -y install pcre-devel

安装zlib zlib-devel依赖:

yum -y install zlib zlib-devel

安装openssl openssl-devel依赖:

yum -y install openssl openssl-devel

② 下载软件包:

下载地址:http://nginx.org/en/download.html

③ 上传软件包:

在服务器上创建安装nginx的文件夹,然后将软件包上传。

④ 解压软件包:

将上传好的nginx软件包进行解压。

⑤ 监测configure:

进入到nginx解压后的文件中,执行configure命令,并通过prefix参数设置nginx安装路径:

./configure --prefix=/home/work/nginx1 --with-stream

⑥ 编译make:

进入到nginx解压后的文件中,执行make命令:

make

⑦ 安装make install:

进入到nginx解压后的文件中,执行make install命令:

make install

⑧ 编写nginx服务脚本:

编写nginx服务文件:

[Unit]

Description=nginx - high performance web server

Documentation=http://nginx.org/en/docs/

After=network.target remote-fs.target nss-lookup.target





[Service]

Type=forking

# 路径对应安装路径

Type=forking

ExecStartPre=/home/work/nginx1/sbin/nginx -t -c /home/work/nginx1/conf/nginx.conf

ExecStart=/home/work/nginx1/sbin/nginx -c /home/work/nginx1/conf/nginx.conf

ExecReload=/home/work/nginx1/sbin/nginx -s reload

ExecStop=/home/work/nginx1/sbin/nginx -s stop

PrivateTmp=true



[Install]

WantedBy=multi-user.target

⑨ 上传服务脚本及授权:

将nginx.service文件上传到服务器/etc/systemd/system/中,并授权:

chmod 777 /etc/systemd/system/nginx.service

⑩ 重新加载系统服务:

执行命令:

systemctl daemon-reload

(2)离线安装nginx:

① 下载nginx的rpm包:

找到自己需要的安装包版本下载即可:

http://nginx.org/packages/rhel/7/x86_64/RPMS

② 上传rpm包到服务器:

将下载好的nginx的rpm离线安装包上传到服务器。

③ 执行rpm安装命令:

在服务器的rpm离线安装包所在的文件夹中,执行rpm命令:

rpm -ivh nginx-1.10.3-1.el7.ngx.x86_64.rpm

④ 修改nginx.conf配置文件:

安装nginx后,nginx安装文件位置如下:

启动命令位置:

可以通过命令查看:

which nginx

/usr/sbin/nginx

配置文件位置:

/etc/nginx/nginx.conf此配置文件中只是配置了简单的参数,具体监控的信息server的配置在单据的conf文件中,在此文件中只是通过include进行引用了。

默认server配置文件位置:

/etc/nginx/conf.d/default.conf此配置文件中是配置了具体的server监控信息。

默认html存储文件位置:

/usr/share/nginx/html

修改nginx.conf的配置文件:

修改一:

将/etc/nginx/nginx.conf中include引用的配置文件路径修改为自己存储conf配置文件的路径;

⑤ 编写nginx服务脚本:

编写nginx服务文件:

[Unit]

Description=nginx - high performance web server

Documentation=http://nginx.org/en/docs/

After=network.target remote-fs.target nss-lookup.target





[Service]

Type=forking

# 路径对应安装路径

Type=forking

ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf

ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf

ExecReload=/usr/sbin/nginx -s reload

ExecStop=/usr/sbin/nginx -s stop

PrivateTmp=true



[Install]

WantedBy=multi-user.target

⑥ 上传服务脚本及授权:

将nginx.service文件上传到服务器/etc/systemd/system/中,并授权:

chmod 777 /etc/systemd/system/nginx.service

⑦ 重新加载系统服务:

执行命令:

systemctl daemon-reload

(3)配置master节点负载均衡:

编辑/etc/nginx/nginx.conf配置文件,配置master节点的负载均衡,增加stream模块,不要在http模块中配置。本地搭建节点之间都是通过https通信因此配置6443端口。

创建日志文件:/var/log/nginx/k8s.log

stream {

    log_format main "$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent";

    access_log  /var/log/nginx/k8s.log  main;

    upstream k8s-apiserver {

        server 192.168.137.129:6443;

        server 192.168.137.130:6443;

server 192.168.137.131:6443;

  }

  server  {

        listen 16443;

        proxy_pass k8s-apiserver;

  }

}

(4)操作nginx服务:

① 开机自启nginx服务:

执行命令:

systemctl enable nginx

② 启动nginx服务:

执行命令:

systemctl start nginx

15、部署k8s的首个master:

说明:在集群中k8s-master-01服务器上进行如下操作:

(1)在线安装:

执行命令:

kubeadm init \

--control-plane-endpoint "192.168.137.129:16443" \

--image-repository registry.aliyuncs.com/google_containers \

--kubernetes-version v1.17.0 \

--service-cidr=172.16.0.0/16 \

--pod-network-cidr=10.244.0.0/16 \

--token "abcdef.0123456789abcdef" \

--token-ttl "0" \

--upload-certs

参数说明:

参数

默认值

参数说明

--control-plane-endpoint

为控制平面指定一个稳定的 IP 地址或 DNS 名称。

--image-repository

"k8s.gcr.io"

选择用于拉取控制平面镜像的容器仓库。

--kubernetes-version

"stable-1"

为控制平面选择一个特定的 Kubernetes 版本。

--service-cidr

"10.96.0.0/12"

为服务的虚拟 IP 地址另外指定 IP 地址段

--pod-network-cidr

指明 pod 网络可以使用的 IP 地址段。如果设置了这个参数,控制平面将会为每一个节点自动分配 CIDRs。

--token

这个令牌用于建立控制平面节点与工作节点间的双向通信。格式为 [a-z0-9]{6}\.[a-z0-9]{16} - 示例:abcdef.0123456789abcdef

--token-ttl

24h0m0s

令牌被自动删除之前的持续时间(例如 1 s,2 m,3 h)。如果设置为 '0',则令牌将永不过期

--upload-certs

将控制平面证书上传到 kubeadm-certs Secret。

(2)离线安装:

在有网的服务器上下载k8s所需的相关镜像,将对应的镜像导出到服务器指定文件夹中,以便在无网服务器中能够导入镜像,进行使用:

① 下载k8s镜像:

从国内镜像源下载镜像:

docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.17.0

docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.17.0

docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.17.0

docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.17.0

docker pull registry.aliyuncs.com/google_containers/pause:3.1

docker pull registry.aliyuncs.com/google_containers/coredns:1.6.5

docker pull registry.aliyuncs.com/google_containers/etcd:3.4.3-0

② 导出镜像:

将修改为官方tag的镜像导入到tar压缩包中,执行命令:

docker save -o kube-proxy-v1.17.0.tar kube-proxy镜像ID registry.aliyuncs.com/google_containers/kube-proxy:v1.17.0

docker save -o kube-apiserver-v1.17.0.tar kube-apiserver镜像ID registry.aliyuncs.com/google_containers/kube-apiserver:v1.17.0

docker save -o kube-controller-manager-v1.17.0.tar kube-controller-manager镜像ID registry.aliyuncs.com/google_containers/kube-controller-manager:v1.17.0

docker save -o kube-scheduler-v1.17.0.tar kube-scheduler镜像ID registry.aliyuncs.com/google_containers/kube-scheduler:v1.17.0

docker save -o pause-3.1.tar pause镜像ID registry.aliyuncs.com/google_containers/pause:3.1

docker save -o coredns-1.6.5.tar coredns镜像ID registry.aliyuncs.com/google_containers/coredns:1.6.5

docker save -o etcd-3.4.3-0.tar etcd镜像ID registry.aliyuncs.com/google_containers/etcd:3.4.3-0

③ 导入镜像:

将上述导出的镜像包tar传输到需要的服务器上,然后通过docker命令将镜像包tar导入到docker本地仓库中,命令示例:

docker image load -i 镜像包tar文件名称

④ 检查镜像列表:

查看docker本地仓库中的镜像列表,执行命令:

docker images

⑤ 部署master节点:

执行命令:

kubeadm init \

--control-plane-endpoint "192.168.137.129:16443" \

--image-repository registry.aliyuncs.com/google_containers \

--kubernetes-version v1.17.0 \

--service-cidr=172.16.0.0/16 \

--pod-network-cidr=10.244.0.0/16 \

--token "abcdef.0123456789abcdef" \

--token-ttl "0" \

--upload-certs

参数说明:

参数

默认值

参数说明

--control-plane-endpoint

为控制平面指定一个稳定的 IP 地址或 DNS 名称。

--image-repository

"k8s.gcr.io"

选择用于拉取控制平面镜像的容器仓库。

--kubernetes-version

"stable-1"

为控制平面选择一个特定的 Kubernetes 版本。

--service-cidr

"10.96.0.0/12"

为服务的虚拟 IP 地址另外指定 IP 地址段

--pod-network-cidr

指明 pod 网络可以使用的 IP 地址段。如果设置了这个参数,控制平面将会为每一个节点自动分配 CIDRs。

--token

这个令牌用于建立控制平面节点与工作节点间的双向通信。格式为 [a-z0-9]{6}\.[a-z0-9]{16} - 示例:abcdef.0123456789abcdef

--token-ttl

24h0m0s

令牌被自动删除之前的持续时间(例如 1 s,2 m,3 h)。如果设置为 '0',则令牌将永不过期

--upload-certs

将控制平面证书上传到 kubeadm-certs Secret。

⑥ 查看部署结果:

出现如下提示信息,表示k8s的master节点部署好了。

(3)生成kubelet环境配置文件:

执行命令:

mkdir -p $HOME/.kube

执行命令:

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

执行命令:

sudo chown $(id -u):$(id -g) $HOME/.kube/config

16、安装pod网络插件(CNI):

说明:在集群中k8s-master-01服务器上进行如下操作:

(1)下载flannel的yml配置文件:

在线flannel的yml文件地址:https://github.com/caoran/kube-flannel.yml/blob/master/kube-flannel.yml,通过该地址将该yml文件下载下来。

(2)上传yml配置文件:

将yml配置文件上传到需要的服务器上。

(3)拉取flannel镜像:

执行命令:

docker pull registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-amd64

(4)重命名flannel镜像:

执行命令:

docker tag flannel镜像ID quay.io/coreos/flannel:v0.12.0-amd64

(5)删除旧flannel镜像:

执行命令:

docker rmi registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-amd64

(6)生效yml配置文件:

在需要的服务器上,进入到yml配置文件所在的文件夹中,然后执行命令进行生效:kubectl apply -f kube-flannel.yml

17、加入k8s其它master:

说明:在集群中k8s-master-01以外的,其它master服务器上进行如下操作:

(1)查看token信息:

① 查询token值:

说明:在集群中master所在服务器,进行如下操作:

执行命令:

kubeadm token list

② 新建token:

说明:在集群中master所在服务器,进行如下操作:

通过kubeadm初始化后,都会提供node加入的token。默认token的有效期为24小时,当过期之后,该token就不可用了,那么就新建一个token。

执行命令:

kubeadm token create

③ 查询discovery-token-ca-cert-hash值:

说明:在集群中master所在服务器,进行如下操作:

执行命令:

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

④ 新建certificate-key值:

说明:在集群中master所在服务器,进行如下操作:

执行命令:

kubeadm init phase upload-certs --upload-certs

,该命令执行完毕后,会返回一个字符串,记录一下即可。

通过kubeadm初始化后,都会提供其它master加入的certificate-key。默认token的有效期为2小时,当过期之后,该certificate-key就不可用了,那么就新建一个certificate-key。

(2)在线加入:

执行命令:

kubeadm join 192.168.137.129:16443 \

--token abcdef.0123456789abcdef \

--discovery-token-ca-cert-hash sha256:8c371e3470ed423a139c7a5879ee4820878c3766232a699da8925392b416390d \

--control-plane \

--certificate-key 91fb332bdece28872755bfd4a7b5a37d4e159f8d228e050b53b0b15d1bad9fc4

参数说明:

参数

默认值

参数说明

--token

这个令牌用于建立控制平面节点与工作节点间的双向通信。格式为 [a-z0-9]{6}\.[a-z0-9]{16} - 示例:abcdef.0123456789abcdef

--discovery-token-ca-cert-hash

对基于令牌的发现,验证根 CA 公钥是否与此哈希匹配 (格式: "<type>:<value>")。

--control-plane

在此节点上创建一个新的控制平面实例

--certificate-key

使用此密钥可以解密由 init 上传的证书 secret。

(3)离线加入:

① 下载k8s镜像:

从国内镜像源下载镜像:

docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.17.0

docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.17.0

docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.17.0

docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.17.0

docker pull registry.aliyuncs.com/google_containers/pause:3.1

docker pull registry.aliyuncs.com/google_containers/coredns:1.6.5

docker pull registry.aliyuncs.com/google_containers/etcd:3.4.3-0

② 导出镜像:

将修改为官方tag的镜像导入到tar压缩包中,执行命令:

docker save -o kube-proxy-v1.17.0.tar kube-proxy镜像ID registry.aliyuncs.com/google_containers/kube-proxy:v1.17.0

docker save -o kube-apiserver-v1.17.0.tar kube-apiserver镜像ID registry.aliyuncs.com/google_containers/kube-apiserver:v1.17.0

docker save -o kube-controller-manager-v1.17.0.tar kube-controller-manager镜像ID registry.aliyuncs.com/google_containers/kube-controller-manager:v1.17.0

docker save -o kube-scheduler-v1.17.0.tar kube-scheduler镜像ID registry.aliyuncs.com/google_containers/kube-scheduler:v1.17.0

docker save -o pause-3.1.tar pause镜像ID registry.aliyuncs.com/google_containers/pause:3.1

docker save -o coredns-1.6.5.tar coredns镜像ID registry.aliyuncs.com/google_containers/coredns:1.6.5

docker save -o etcd-3.4.3-0.tar etcd镜像ID registry.aliyuncs.com/google_containers/etcd:3.4.3-0

③ 导入镜像:

将上述导出的镜像包tar传输到需要的服务器上,然后通过docker命令将镜像包tar导入到docker本地仓库中,命令示例:

docker image load -i 镜像包tar文件名称

④ 检查镜像列表:

查看docker本地仓库中的镜像列表,执行命令:

docker images

⑤ 加入k8s集群:

执行命令:

kubeadm join 192.168.137.129:16443 \

--token abcdef.0123456789abcdef \

--discovery-token-ca-cert-hash sha256:8c371e3470ed423a139c7a5879ee4820878c3766232a699da8925392b416390d \

--control-plane \

--certificate-key 91fb332bdece28872755bfd4a7b5a37d4e159f8d228e050b53b0b15d1bad9fc4

参数说明:

参数

默认值

参数说明

--token

这个令牌用于建立控制平面节点与工作节点间的双向通信。格式为 [a-z0-9]{6}\.[a-z0-9]{16} - 示例:abcdef.0123456789abcdef

--discovery-token-ca-cert-hash

对基于令牌的发现,验证根 CA 公钥是否与此哈希匹配 (格式: "<type>:<value>")。

⑥ 查看部署结果:

出现如下提示信息,表示加入k8s集群了。

(4)生成kubelet环境配置文件:

执行命令:

mkdir -p $HOME/.kube

执行命令:

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

执行命令:

sudo chown $(id -u):$(id -g) $HOME/.kube/config

18、加入k8s的node:

说明:在集群中node所在服务器,进行如下操作:

(1)如果是离线加入需要操作:

① 拉取kube-proxy镜像:

执行命令:

docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.17.0

(2)拉取flannel镜像:

执行命令:

docker pull registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-amd64

(3)重命名flannel镜像:

执行命令:

docker tag flannel镜像ID quay.io/coreos/flannel:v0.12.0-amd64

(4)删除旧flannel镜像:

执行命令:docker rmi registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-amd64

(5)向集群添加新节点:

① 查询token值:

说明:在集群中master所在服务器,进行如下操作:

执行命令:

kubeadm token list

② 新建token:

说明:在集群中master所在服务器,进行如下操作:

通过kubeadm初始化后,都会提供node加入的token。默认token的有效期为24小时,当过期之后,该token就不可用了,那么就新建一个token。

执行命令:

kubeadm token create

③ 查询discovery-token-ca-cert-hash值:

说明:在集群中master所在服务器,进行如下操作:

执行命令:

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

④ 添加新节点到集群:

说明:在集群中node所在服务器,进行如下操作:

执行命令:

kubeadm join 192.168.137.129:6443 --token zz5xc1.svx9tw1msbbd2v2l --discovery-token-ca-cert-hash sha256:2232ff536c7a272d52dfbce2ba07fa947fee7bcf6724095ef3c6def5dc34374e

参数说明:

参数

默认值

参数说明

--token

这个令牌用于建立控制平面节点与工作节点间的双向通信。格式为 [a-z0-9]{6}\.[a-z0-9]{16} - 示例:abcdef.0123456789abcdef

--discovery-token-ca-cert-hash

对基于令牌的发现,验证根 CA 公钥是否与此哈希匹配 (格式: "<type>:<value>")。

⑤ 查看node列表:

说明:在集群中master所在服务器,进行如下操作:

执行命令:

kubectl get node

(6)安装pod网络插件(CNI):

说明:如果在master服务器上安装pod网络插件(CNI)是在node加入k8s之后的话,那么就不需要手动在node服务器上安装CNI了,因为在master上安装CNI时会在整个k8s集群上安装。

检查当前node服务器/etc/cni/net.d/10-flannel.conflist文件是否存在,如果存在就不需要执行以下操作了。如果没有就进行如下操作。

以下操作只是针对已经安装好CNI后,又往k8s集群中增加node节点:

由于安装pod网络插件(CNI)在节点加入k8s之前,因此不会在node上安装CNI,需要手动将master服务器上的/etc/cni/net.d/10-flannel.conflist文件拷贝到当前node服务器上的对应路径下。

然后在node节点上执行命令:

systemctl daemon-reload && systemctl restart kubelet

(7)查看node列表:

说明:在集群中master所在服务器,进行如下操作:

执行命令:

kubectl get node

19、测试验证k8s集群:

(1)拉取nginx镜像:

由于本次搭建没有使用私有镜像库,因此在每个node节点上,需要手动拉取以下nginx镜像。执行命令:

docker pull nginx

(2)创建nginx容器:

执行命令:

kubectl create deployment nginx --image=nginx

(3)暴露对外端口:

执行命令:

kubectl expose deployment nginx --port=80 --type=NodePort

(4)查询nginx是否运行成功:

执行命令:

kubectl get pod,svc

(5)浏览器测试访问:

在与k8s集群通网络段的windows服务器上的浏览器中,输入k8s集群的master或node节点IP及对应nginx映射出的端口号,进行访问,正常的话是可以访问到nginx欢迎页的。

(6)扩展nginx副本:

执行命令:

kubectl scale deployment nginx --replicas=3

(7)查看pod:

通过对nginx进行了扩展副本,然后查看nginx的pod是几个,是否生效,执行命令:

kubectl get pods

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐