部署方式:
Kubernetes 集群的部署方式有多种,使用批量部署工具如(ansible/saltstack)等自动化大部分部署任务或者直接手动部署二进制预编译的软件包。还有一种方式是使用kubeadm 结合 apt-get/yum 安装必要软件安装,以守护进程的方式启动在宿主机上,本次就使用 kubeadm 来部署 Kubernetes 集群。
基本环境
OS采用Ubuntu18.04
Docker 19.03.8
Kubernetes: 1.17.3*
kubeadm: v1.17.2
IP地址: | 主机名 |
---|---|
192.168.39.5 | master1 |
192.168.39.15 | master2 |
192.168.39.203 | master3 |
192.168.39.201 | node1 |
192.168.39.202 | node2 |
192.168.39.203 | node3 |
K8s官方参考文档
使用 k8s 官方提供的部署工具 kubeadm 自动安装,需要在 master 和 node 节点上
安装 docker 等组件,然后初始化,把管理端的控制服务和 node 上的服务都以 pod
的方式运行
一、
1、 设置主机名解析:
vim /etc/hosts
192.168.39.15 master1 master1.com
192.168.39.5 master2 master2.com
192.168.39.206 master3 master3.com
192.168.39.201 node1 node1.com
192.168.39.202 node2 node2.com
192.168.39.203 node3 node3.com
2、时间同步:
在集群的 Master 和各 node 同步时间,也可写入计划任务
~# ntpdate ntp.aliyun.com
或者
~# crontab -e
...
*/12 * * * * root /bin/bash ntpdate ntp.aliyun.com
3、关闭系统的防火墙并且金庸swap设备
~# swappoff -a
二、部署Kubernetes集群
2.1、可参考Kubeadm部署参考----步骤过程如下。
- 部署 HAProxy 和 Keepalived 作为 Kubernetes 管理端的访问入口,及实现访问入口高可用。
- 在 Master 及各 Node 安装 Docker、kubelet、kubectl 和 kubeadm,以守护进程方式启动 Docker 及 kubelet。
- 在其中一台 Master 上使用kubeadm init进程集群初始化。
- 在其他的 Master 上使用kubeadm join命令加入集群。
- 在各 Node 上使用kubeadm join命令加入初始化完成的集群。
- 在集群上部署网络组件,如 flannel 或者 calico 等来提供 service 网络和 pod 网络。
2.2 在各 master 节点安装 kubeadm、kubelet、kubectl、Docker
2.2.1 在阿里云配置 K8s 镜像源
~# apt update && apt-get install -y apt-transport-https
~# curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
~# cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
~# apt update
2.2.2所有服务器点安装 kubelet kubeadm kubectl:
# apt-get update
#安装指定版本 kubeadm
查看版本信息
# apt-cache madison kubeadm
安装 kubeadm kubectl kubelet
# apt install kubeadm=1.17.3-00 kubectl=1.17.3-00 kubelet=1.17.3-00
启动并验证 kubelet
# systemctl start kubelet && systemctl enable kubelet && systemctl status kubelet
2.3 master 节点运行 kubeadm init 初始化命令:
在三台 master 中任意一台 master 进行集群初始化,而且集群初始化只需要初始化一次。
kubeadm 命令使用:
kubeadm init 命令简介:
命令使用:https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm/
Available Commands:
alpha #kubeadm 处于测试阶段的命令
completion #bash 命令补全,需要安装 bash-completion
#mkdir /data/scripts -p
#kubeadm completion bash > /data/scripts/kubeadm_completion.sh
#source /data/scripts/kubeadm_completion.sh
#vim /etc/profile
source /data/scripts/kubeadm_completion.sh
config #管理 kubeadm 集群的配置,该配置保留在集群的 ConfigMap 中
#kubeadm config print init-defaults
help Help about any command
init #启动一个 Kubernetes 主节点
join #将节点加入到已经存在的 k8s master
reset 还原使用 kubeadm init 或者 kubeadm join 对系统产生的环境变化
token #管理 token
upgrade #升级 k8s 版本
version #查看版本信息
集群初始化:https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm-init/
root@docker-node1:~# kubeadm init --help
--apiserver-advertise-address string #K8S API Server 将要监听的监听的本机 IP
--apiserver-bind-port int32 #API Server 绑定的端口,默认为 6443
--apiserver-cert-extra-sans stringSlice #可选的证书额外信息,用于指定 API Server 的服务器证
书。可以是 IP 地址也可以是 DNS 名称。
--cert-dir string #证书的存储路径,缺省路径为 /etc/kubernetes/pki
--certificate-key string #定义一个用于加密 kubeadm-certs Secret 中的控制平台证书的密钥
--config string #kubeadm #配置文件的路径
--control-plane-endpoint string #为控制平台指定一个稳定的 IP 地址或 DNS 名称,即配置一
个可以长期使用切是高可用的 VIP 或者域名,k8s 多 master 高可用基于此参数实现
--cri-socket string #要连接的 CRI(容器运行时接口,Container Runtime Interface, 简称 CRI)套
接字的路径,如果为空,则 kubeadm 将尝试自动检测此值,"仅当安装了多个 CRI 或具有非
标准 CRI 插槽时,才使用此选项"
--dry-run #不要应用任何更改,只是输出将要执行的操作,其实就是测试运行。
--experimental-kustomize string #用于存储 kustomize 为静态 pod 清单所提供的补丁的路径。
--feature-gates string #一组用来描述各种功能特性的键值(key=value)对,选项是:
IPv6DualStack=true|false (ALPHA - default=false)
--ignore-preflight-errors strings #可以忽略检查过程 中出现的错误信息,比如忽略 swap,如
果为 all 就忽略所有
--image-repository string #设置一个镜像仓库,默认为 k8s.gcr.io
--kubernetes-version string #指定安装 k8s 版本,默认为 stable-1
--node-name string #指定 node 节点名称
--pod-network-cidr #设置 pod ip 地址范围
--service-cidr #设置 service 网络地址范围
--service-dns-domain string #设置 k8s 内部域名,默认为 cluster.local,会有相应的 DNS 服务
(kube-dns/coredns)解析生成的域名记录。
--skip-certificate-key-print #不打印用于加密的 key 信息
--skip-phases strings #要跳过哪些阶段
--skip-token-print #跳过打印 token 信息
--token #指定 token
--token-ttl #指定 token 过期时间,默认为 24 小时,0 为永不过期
--upload-certs #更新证书
#全局可选项:
--add-dir-header #如果为 true,在日志头部添加日志目录
--log-file string #如果不为空,将使用此日志文件
--log-file-max-size uint #设置日志文件的最大大小,单位为兆,默认为 1800 兆,0 为没有限
制
--rootfs #宿主机的根路径,也就是绝对路径
--skip-headers #如果为 true,在 log 日志里面不显示标题前缀
--skip-log-headers #如果为 true,在 log 日志里里不显示标题
2.4、准备镜像
查看Kubeadm的版本:
root@kube-master1:~# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.2", GitCommit:"59603c6e503c87169aea6106f57b9f242f64df89", GitTreeState:"clean", BuildDate:"2020-01-18T23:27:49Z", GoVersion:"go1.13.5", Compiler:"gc", Platform:"linux/amd64"}
查看安装指定版本 k8s 需要的镜像有哪些
#kubeadm config images list --kubernetes-version v1.17.3
k8s.gcr.io/kube-apiserver:v1.17.3
k8s.gcr.io/kube-controller-manager:v1.17.3
k8s.gcr.io/kube-scheduler:v1.17.3
k8s.gcr.io/kube-proxy:v1.17.3
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.5
master 节点镜像下载:
推荐提前在 master 节点下载镜像以减少安装等待时间,但是镜像默认使用 Google 的镜像仓库,所以国内无法直接下载,但是可以通过阿里云的镜像仓库把镜像先提前下载下来,可以避免后期因镜像下载异常而导致 k8s 部署异常。
# cat images-download.sh
#!/bin/bash
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.17.3
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controllermanager:v1.17.3
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.17.3
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.17.3
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.5
# bash images-download.sh
2.4、:高可用 master 初始化:
注:单节点初始化可直接去掉–control-plane-endpoin*t选项,这里演示高可用master初始化*
~# kubeadm init\
--apiserver-advertise-address=192.168.39.5\
--control-plane-endpoint=192.168.39.234\
--apiserver-bind-port=6443\
--ignore-preflight-errors='swap'\
--image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers\
--kubernetes-version=v1.17.3\
--pod-network-cidr=10.20.0.0/16\
--service-cidr=172.20.0.0/20\
--service-dns-domain=linux39.com
出现一下界面证明初始化成功,使用提示命令加入master节点和node节点:
2.5、当前 maste 生成证书用于添加新控制节点:
# kubeadm init phase upload-certs --upload-certs
W0322 11:38:39.512764 18966 validation.go:28] Cannot validate kube-proxy config - no
validator is available
W0322 11:38:39.512817 18966 validation.go:28] Cannot validate kubelet config - no validator
is available
[upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system"
Namespace
[upload-certs] Using certificate key:
b66cd885cbd3b94cace2ddfad3037935ba3dabc63bf2aee0c28878b6857ac53b
2.6、配置 kube-config 文件及网络组件:Kube-config 文件中包含 kube-apiserver 地址及相关认证信息
配置 kube-config 文件:
# mkdir -p $HOME/.kube
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# sudo chown $(id -u):$(id -g) $HOME/.kube/config
# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master1.magedu.net NotReady master 10m v1.17.3
部署网络组件 flannel:
https://github.com/coreos/flannel/
# kubectl apply -f kube-flannel.yml 最后执行kubectl
2.7 在另外一台已经安装了 docker、kubeadm 和 kubelet 的 master 节点上执行以下操作:
# kubeadm join 172.31.7.248:6443 --token 0fpghu.wt0t8adybh86jzvk \
--discovery-token-ca-cert-hash
sha256:aae2c43db9929b06c094e65a4614112676f8cafb80809c8071f2ee141edfc787 \
--control-plane --certificate-key
b66cd885cbd3b94cace2ddfad3037935ba3dabc63bf2aee0c28878b6857ac53b
查看集群的状态:
root@master2:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 Ready <none> 3h27m v1.17.3
master2 Ready master 3h57m v1.17.3
master3 Ready master 3h38m v1.17.3
ubuntu1804 Ready <none> 3h11m v1.17.3
k8s 集群添加 node 节点:
各需要加入到 k8s master 集群中的 node 节点都要安装 docker kubeadm kubelet ,因此都要
重新执行安装 docker kubeadm kubelet 的步骤,即配置 apt 仓库、配置 docker 加速器、安装
命令、启动 kubelet 服务。
3、基于文件初始化高可用 master 方式:
# kubeadm config print init-defaults #输出默认初始化配置
# kubeadm config print init-defaults > kubeadm-init.yaml #将默认配置输出至文件
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 48h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.39.15
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: master2
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 192.168.39.234:6443
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.17.3
networking:
dnsDomain: linux39.com
podSubnet: 10.20.0.0/16
serviceSubnet: 172.20.0.0/16
scheduler: {}
执行以下命令:
# kubeadm init --config kubeadm-init.yaml #基于文件执行 k8s master 初始化
初始化成功,跟以上一样添加node节点,和master节点
验证集群状态:
root@master1:# kubectl get nodes
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy {"health":"true"}
当前 csr 证书状态:
root@master1:/# kubectl get csr
NAME AGE REQUESTOR CONDITION
csr-c4pt8 39m system:bootstrap:abcdef Approved,Issued