Kubernetes(一)基于Kubeadm集群部署

部署方式:
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部署参考----步骤过程如下。
  1. 部署 HAProxy 和 Keepalived 作为 Kubernetes 管理端的访问入口,及实现访问入口高可用。
  2. 在 Master 及各 Node 安装 Docker、kubelet、kubectl 和 kubeadm,以守护进程方式启动 Docker 及 kubelet。
  3. 在其中一台 Master 上使用kubeadm init进程集群初始化。
  4. 在其他的 Master 上使用kubeadm join命令加入集群。
  5. 在各 Node 上使用kubeadm join命令加入初始化完成的集群。
  6. 在集群上部署网络组件,如 flannel 或者 calico 等来提供 service 网络和 pod 网络。
2.2 在各 master 节点安装 kubeadm、kubelet、kubectl、Docker

安装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
发布了24 篇原创文章 · 获赞 16 · 访问量 2109

猜你喜欢

转载自blog.csdn.net/weixin_42776624/article/details/105184424