一、环境
服务器信息
主机名 | IP | 备注 |
---|---|---|
k8s-master1 | 192.168.0.216 | Master1,etcd1,node节点 |
k8s-master2 | 192.168.0.217 | Master2,etcd2,node节点 |
k8s-master3 | 192.168.0.218 | Master3,etcd3,node节点 |
slb | lb.ypvip.com.cn | 外网阿里slb域名 |
本环境使用阿里云,
API Server
高可用通过阿里云SLB
实现,如果环境不在云上,可以通过 Nginx + Keepalived,或者 HaProxy + Keepalived等实现。
服务版本与K8S集群说明
阿里slb
设置TCP监听
,监听6443端口(通过四层负载到master apiserver)。- 所有
阿里云ECS主机
使用CentOS 7.6.1810
版本,并且内核都升到5.x
版本。 - K8S 集群使用
Iptables 模式
(kube-proxy 注释中预留Ipvs
模式配置) - Calico 使用
IPIP
模式 - 集群使用默认
svc.cluster.local
10.10.0.1
为集群 kubernetes svc 解析ip- Docker CE version 19.03.6
- Kubernetes Version 1.18.2
- Etcd Version v3.4.7
- Calico Version v3.14.0
- Coredns Version 1.6.7
- Metrics-Server Version v0.3.6
1 | $ kubectl get svc |
PS:上面服务版本都是使用
当前最新版本
Service 和 Pods Ip 段划分
名称 | IP网段 | 备注 |
---|---|---|
service-cluster-ip | 10.10.0.0/16 | 可用地址 65534 |
pods-ip | 10.20.0.0/16 | 可用地址 65534 |
集群dns | 10.10.0.2 | 用于集群service域名解析 |
k8s svc | 10.10.0.1 | 集群 kubernetes svc 解析ip |
二、环境初始化
所有集群服务器都需要初始化
2.1 停止所有机器 firewalld 防火墙
1 | $ systemctl stop firewalld |
2.2 关闭 swap
1 | $ swapoff -a |
2.3 关闭 Selinux
1 | $ setenforce 0 |
2.4 设置主机名、升级内核、安装 Docker ce
运行下面 init.sh
shell 脚本,脚本完成下面四项任务:
- 设置服务器
hostname
- 安装
k8s依赖环境
升级系统内核
(升级Centos7系统内核,解决Docker-ce版本兼容问题)- 安装
docker ce
19.03.6 版本
在每台机器上运行 init.sh 脚本,示例如下:
Ps:init.sh 脚本只用于
Centos
,支持重复运行
。
1 | # k8s-master1 机器运行,init.sh 后面接的参数是设置 k8s-master1 服务器主机名 |
1 |
|
三、Kubernetes 部署
部署顺序
- 1、自签TLS证书
- 2、部署Etcd集群
- 3、创建 metrics-server 证书
- 4、获取K8S二进制包
- 5、创建Node节点kubeconfig文件
- 6、配置Master组件并运行
- 7、配置kubelet证书自动续期和创建Node授权用户
- 8、配置Node组件并运行
- 9、安装calico网络,使用IPIP模式
- 10、集群CoreDNS部署
- 11、部署集群监控服务 Metrics Server
- 12、部署 Kubernetes Dashboard
3.1 自签TLS证书
在
k8s-master1
安装证书生成工具 cfssl,并生成相关证书
1 | # 创建目录用于存放 SSL 证书 |
1 | # 进入证书目录 |
PS:证书有效期为
10年
1 | cat > ca-config.json <<EOF |
根据自己环境修改 certificate.sh
脚本
1 | "192.168.0.216", |
修改完脚本,然后执行
1 | $ bash certificate.sh |
3.2 部署Etcd集群
k8s-master1 机器上操作,把执行文件copy到 k8s-master2 k8s-master3
二进制包下载地址:https://github.com/etcd-io/etcd/releases/download/v3.4.7/etcd-v3.4.7-linux-amd64.tar.gz
1 | # 创建存储etcd数据目录 |
登陆到
k8s-master2
和k8s-master3
服务器上操作
1 | # 创建 k8s 集群配置目录 |
登陆到
k8s-master1
操作
1 | # 进入 K8S 集群证书目录 |
1 | $ cd /data/etcd |
1 |
|
1 | # 执行 etcd.sh 生成配置脚本 |
登陆到
k8s-master2
操作
1 | # 执行 etcd.sh 生成配置脚本 |
登陆到
k8s-master3
操作
1 | # 执行 etcd.sh 生成配置脚本 |
1 | # 随便登陆一台master机器,查看 etcd 集群是否正常 |
3.3 创建 metrics-server 证书
创建 metrics-server 使用的证书
登陆到
k8s-master1
操作
1 | $ cd /data/ssl/ |
生成 metrics-server 证书和私钥
1 | # 生成证书 |
3.4 获取K8S二进制包
登陆到
k8s-master1
操作v1.18 下载页面 https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.18.md
1 | # 创建存放 k8s 二进制包目录 |
master 节点需要用到:
- kubectl
- kube-scheduler
- kube-apiserver
- kube-controller-manager
node 节点需要用到:
- kubelet
- kube-proxy
PS:本文master节点也做为一个node节点,所以需要用到 kubelet kube-proxy 执行文件
1 | # 进入解压出来二进制包bin目录 |
3.5 创建Node节点kubeconfig文件
登陆到
k8s-master1
操作
- 创建TLS Bootstrapping Token
- 创建kubelet kubeconfig
- 创建kube-proxy kubeconfig
1 | $ cd /data/ssl/ |
修改
kubeconfig.sh
脚本配置KUBE_APISERVER
变量时,一定要把https://
带上,否则默认使用http://
请求
1 | # 创建 TLS Bootstrapping Token |
1 | # 生成证书 |
1 | # copy *kubeconfig 文件到 /opt/kubernetes/cfg 目录 |
3.6 配置Master组件并运行
登陆到
k8s-master1
k8s-master2
k8s-master3
操作
1 | # 创建 /data/k8s-master 目录,用于存放 master 配置执行脚本 |
登陆到
k8s-master1
1 | $ cd /data/k8s-master |
1 |
|
1 | # 创建生成 kube-controller-manager 配置文件脚本 |
1 |
|
1 | # 创建生成 kube-scheduler 配置文件脚本 |
1 |
|
1 | # 添加执行权限 |
登陆到
k8s-master2
操作
1 | $ cd /data/k8s-master |
登陆到
k8s-master3
操作
1 | $ cd /data/k8s-master |
1 | # 随便登陆一台master查看集群健康状态 |
错误处理
1 | # 查询集群状态报下面错误 |
两种解决方法:
- 1、可以把kubectl版本降级到1.17版本,生成管理员config文件,并存放到 ~/.kube/config 目录下,再把 kubectl升级到1.18版本,这时就可以正常使用
- 2、直接声明下
KUBERNETES_MASTER
Apiserver 地址,不推荐这种方法
这里介绍生成管理员 config
配置
1 | # 降级 kubectl 版本到 1.17.5 |
1 |
|
1 | # 添加执行权限 |
1 | # 创建 .kube 目录 |
3.7 配置kubelet证书自动续期和创建Node授权用户
登陆到
k8s-master1
操作
创建 Node节点
授权用户 kubelet-bootstrap
1 | $ kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap |
创建自动批准相关 CSR 请求的 ClusterRole
1 | # 创建证书旋转配置存放目录 |
1 | kind: ClusterRole |
1 | # 部署 |
自动批准 kubelet-bootstrap 用户 TLS bootstrapping 首次申请证书的 CSR 请求
1 | $ kubectl create clusterrolebinding node-client-auto-approve-csr --clusterrole=system:certificates.k8s.io:certificatesigningrequests:nodeclient --user=kubelet-bootstrap |
自动批准 system:nodes 组用户更新 kubelet 自身与 apiserver 通讯证书的 CSR 请求
1 | $ kubectl create clusterrolebinding node-client-auto-renew-crt --clusterrole=system:certificates.k8s.io:certificatesigningrequests:selfnodeclient --group=system:nodes |
自动批准 system:nodes 组用户更新 kubelet 10250 api 端口证书的 CSR 请求
1 | $ kubectl create clusterrolebinding node-server-auto-renew-crt --clusterrole=system:certificates.k8s.io:certificatesigningrequests:selfnodeserver --group=system:nodes |
3.8 配置Node组件并运行
首先我们先了解下 kubelet
中 kubelet.kubeconfig
配置是如何生成?
kubelet.kubeconfig
配置是通过 TLS Bootstrapping
机制生成,下面是生成的流程图。
登陆到
k8s-master1
k8s-master2
k8s-master3
操作
1 | # 创建 node 节点生成配置脚本目录 |
登陆到
k8s-master1
操作
1 | # 创建生成 kubelet 配置脚本 |
1 |
|
1 | # 创建生成 kube-proxy 配置脚本 |
1 |
|
1 | # 生成 node 配置文件 |
登陆到
k8s-master2
操作
1 | $ cd /data/k8s-node |
登陆到
k8s-master3
操作
1 | $ cd /data/k8s-node |
1 | # 随便登陆一台master机器查看node节点是否添加成功 |
上面 Node 节点处理
NoReady
状态,是因为目前还没有安装网络组件,下文安装网络组件。
解决无法查询pods日志问题
1 | $ vim ~/yaml/apiserver-to-kubelet-rbac.yml |
1 | kind: ClusterRoleBinding |
1 | # 应用 |
3.9 安装calico网络,使用IPIP模式
登陆到
k8s-master1
操作
下载 Calico Version v3.14.0
Yaml 文件
1 | # 存放etcd yaml文件 |
calico-etcd.yaml
需要修改如下配置:
Secret 配置修改
1 | apiVersion: v1 |
ConfigMap
配置修改
1 | kind: ConfigMap |
关于ConfigMap部分主要参数如下:
etcd_endpoints
:Calico使用etcd来保存网络拓扑和状态,该参数指定etcd的地址,可以使用K8S Master所用的etcd,也可以另外搭建。calico_backend
:Calico的后端,默认为bird。cni_network_config
:符合CNI规范的网络配置,其中type=calico表示,Kubelet 从 CNI_PATH (默认为/opt/cni/bin)目录找calico的可执行文件,用于容器IP地址的分配。- etcd 如果配置
TLS安全认证
,则还需要指定相应的ca
、cert
、key
等文件
修改 Pods 使用的 IP 网段
,默认使用 192.168.0.0/16
网段
1 | - name: CALICO_IPV4POOL_CIDR |
配置网卡自动发现规则
在 DaemonSet calico-node env
中添加网卡发现规则
1 | # 定义ipv4自动发现网卡规则 |
Calico 模式设置
1 | # Enable IPIP |
Calico 有两种网络模式:BGP
和 IPIP
- 使用
IPIP
模式时,设置CALICO_IPV4POOL_IPIP="always"
,IPIP 是一种将各Node的路由之间做一个tunnel
,再把两个网络连接起来的模式,启用IPIP模式时,Calico将在各Node上创建一个名为tunl0
的虚拟网络接口。 - 使用
BGP
模式时,设置CALICO_IPV4POOL_IPIP="off"
错误解决方法
错误
: [ERROR][8] startup/startup.go 146: failed to query kubeadm’s config map error=Get https://10.10.0.1:443/api/v1/namespaces/kube-system/configmaps/kubeadm-config?timeout=2s: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
原因
:Node工作节点连接不到 apiserver
地址,检查一下calico配置文件,要把apiserver的IP和端口配置上,如果不配置的话,calico默认将设置默认的calico网段和443端口。字段名:KUBERNETES_SERVICE_HOST
、KUBERNETES_SERVICE_PORT
、KUBERNETES_SERVICE_PORT_HTTPS
。
解决方法
:
在 DaemonSet calico-node env
中添加环境变量
1 | - name: KUBERNETES_SERVICE_HOST |
修改完 calico-etcd.yaml
后,执行部署
1 | # 部署 |
3.10 集群CoreDNS部署
登陆到
k8s-master1
操作
deploy.sh
是一个便捷的脚本,用于生成coredns yaml 配置。
1 | # 安装依赖 jq 命令 |
默认情况下 CLUSTER_DNS_IP
是自动获取kube-dns的集群ip的,但是由于没有部署kube-dns所以只能手动指定一个集群ip。
1 | 111 if [[ -z $CLUSTER_DNS_IP ]]; then |
1 | # 查看执行效果,并未开始部署 |
测试 Coredns 解析
1 | # 创建一个 busybox Pod |
1 | apiVersion: v1 |
1 | # 部署 |
3.11 部署集群监控服务 Metrics Server
登陆到
k8s-master1
操作
1 | $ cd ~/yaml |
只修改 metrics-server-deployment.yaml
配置文件
1 | # 下面是修改前后比较差异 |
1 | # 部署 |
3.12 部署 Kubernetes Dashboard
Kubernetes Dashboard 部署,请参考 K8S Dashboard 2.0 部署 文章。
结束语
Kubernetes v1.18.2 二进制部署,作者测试过无坑。这篇部署文章完全可以直接用于生产环境部署。全方位包含整个 Kubernetes 组件部署。
参考链接
- https://blog.51cto.com/1014810/2474723
- https://docs.projectcalico.org/getting-started/kubernetes/installation/config-options#customizing-application-layer-policy-manifests
- https://docs.projectcalico.org/reference/node/configuration
- https://webcache.googleusercontent.com/search?q=cache:ihRi-OM5WboJ:https://www.cnblogs.com/Christine-ting/p/12837403.html+&cd=1&hl=zh-CN&ct=clnk
---本文结束感谢您的阅读。微信扫描二维码,关注我的公众号---
本文链接: https://www.yp14.cn/2020/05/19/Kubernetes-v1-18-2-二进制高可用部署/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!