二进制包安装kubernetes1.19.0

前言:根据《kubernetes权威指南第5版》操作的,途中遇到了很多问题,所以写一篇博客记录一下

master高可用集群架构初步讲解

在正式环境中应确保Master的高可用,并启用安全访问机制,至少 包括以下几方面。
Master的kube-apiserver、kube-controller-mansger和kube-scheduler服务至少以3个节点的多实例方式部署。
◎ Master启用基于CA认证的HTTPS安全机制。
◎ etcd至少以3个节点的集群模式部署。
◎ etcd集群启用基于CA认证的HTTPS安全机制。
◎ Master启用RBAC授权模式

Master的高可用部署架构如图
在这里插入图片描述

在Master的3个节点之前,应通过一个负载均衡器提供对客户端的 唯一访问入口地址,负载均衡器可以选择硬件或者软件进行搭建
这里选用:HAProxy搭配Keepalived为例
本例中3台主机的IP地址分别为192.168.18.3、192.168.18.4、 192.168.18.5,负载均衡器使用的VIP为192.168.18.100。
下面分别对etcd、负载均衡器、Master、Node等组件如何进行高可 用部署、关键配置、CA证书配置等进行详细说明

创建CA根证书

前言:为etcd和Kubernetes服务启用基于CA认证的安全机制,需要CA证书 进行配置。如果组织能够提供统一的CA认证中心,则直接使用组织颁 发的CA证书即可。如果没有统一的CA认证中心,则可以通过颁发自签 名的CA证书来完成安全配置。 etcd和Kubernetes在制作CA证书时,均需要基于CA根证书,本文以 为Kubernetes和etcd使用同一套CA根证书为例,对CA证书的制作进行说明

注意:证书只需要在一台服务器中生成就好,然后再依次拷贝到其他服务器中。证书要统一才行,不然集群会出现问题

# openssl genrsa -out ca.key 2048
# openssl req -x509 -new -nodes -key ca.key -subj "/CN=192.168.18.3" -days 36500 -out ca.crt

-subj: "/CN"的值为Master主机名或者IP地址
-days: 设置证书的有效期
将生成的ca.key和ca.crt文件保存在【/etc/kubernetes/pki目录下】

部署安全的etcd高可用集群

etcd作为Kubernetes集群的主数据库,在安装Kubernetes各服务之前 需要首先安装和启动
下载etcd二进制文件,配置systemd服务 从GitHub官网下载etcd二进制文件,例如etcd-v3.4.13-linux- amd64.tar.gz
官方路径:https://github.com/etcd-io/etcd/releases
在这里插入图片描述
解压缩后得到etcd和etcdctl文件,将它们复制到【/usr/bin目录下】。 然后将其部署为一个systemd的服务,创建systemd服务配置文 件/usr/lib/systemd/system/etcd.service,内容示例如下:

[Unit]
Description=etcd key-value store
Documentation=https://github.com/etcd-io/etcd
After=network.target

[Service]
EnvironmentFile=/etc/etcd/etcd.conf
ExecStart=/usr/bin/etcd
Restart=always

[Install]
WantedBy=multi-user.target

其中,EnvironmentFile指定配置文件的全路径,例 如【/etc/etcd/etcd.conf】,其中的参数以环境变量的格式进行配置。(后面会补充改文件内容)

接下来先对etcd需要的CA证书配置进行说明。对于配置文 件/etc/etcd/etcd.conf中的完整配置参数,将在创建完CA证书后统一说明

创建etcd的CA证书

先创建一个x509 v3配置文件etcd_ssl.cnf,其中subjectAltName参数 (alt_names)包括所有etcd主机的IP地址
解释:我理解的是,就是创建一个etcd_ssl.cnf文件,然后里面放一下内容【我是放到 /etc/etcd/pki/ 路径下】:

[ req ]
req_extensions = v3_req
distinguished_name = req_distinguished_name
 
[ req_distinguished_name ]
 
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
 
[ alt_names ]
IP.1 = 192.168.18.3
IP.2 = 192.168.18.4
IP.3 = 192.168.18.5
创建etcd服务端CA证书

然后使用openssl命令创建etcd的服务端CA证书,包括 etcd_server.key和etcd_server.crt文件,将其保存到【/etc/etcd/pki目录下】

# openssl genrsa -out etcd_server.key 2048
 
# openssl req -new -key etcd_server.key -config etcd_ssl.cnf -subj "/CN=etcd-server" -out etcd_server.csr
 
# openssl x509 -req -in etcd_server.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -days 36500 -extensions v3_req -extfile etcd_ssl.cnf -out etcd_server.crt
创建etcd客户端CA证书

创建客户端使用的CA证书,包括etcd_client.key和etcd_client.crt文 件,也将其保存到【/etc/etcd/pki目录下】,后续供kube-apiserver连接etcd时 使用:

# openssl genrsa -out etcd_client.key 2048
 
# openssl req -new -key etcd_client.key -config etcd_ssl.cnf -subj "/CN=etcd-client" -out etcd_client.csr
 
# openssl x509 -req -in etcd_client.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -days 36500 -extensions v3_req -extfile etcd_ssl.cnf -out etcd_client.crt

注意以上证书,在一台机子上生成就好了,然后copy到其他服务器中就好

创建etcd配置文件

接下来对3个etcd节点进行配置。etcd节点的配置方式包括启动参 数、环境变量、配置文件等,本例使用环境变量方式将其配置 到【/etc/etcd/etcd.conf文件中】,供systemd服务读取。
3个etcd节点分别部署在192.168.18.3、192.168.18.4和192.168.18.5 3 台主机上,配置文件/etc/etcd/etcd.conf的内容示例如下:
192.168.18.3服务器中的/etc/etcd/etcd.conf

# /etc/etcd/etcd.conf - node 1
ETCD_NAME=etcd1
ETCD_DATA_DIR=/etc/etcd/data

ETCD_CERT_FILE=/etc/etcd/pki/etcd_server.crt
ETCD_KEY_FILE=/etc/etcd/pki/etcd_server.key
ETCD_TRUSTED_CA_FILE=/etc/kubernetes/pki/ca.crt
ETCD_CLIENT_CERT_AUTH=true
ETCD_LISTEN_CLIENT_URLS=https://192.168.18.3:2379
ETCD_ADVERTISE_CLIENT_URLS=https://192.168.18.3:2379
ETCD_PEER_CERT_FILE=/etc/etcd/pki/etcd_server.crt
ETCD_PEER_KEY_FILE=/etc/etcd/pki/etcd_server.key
ETCD_PEER_TRUSTED_CA_FILE=/etc/kubernetes/pki/ca.crt
ETCD_LISTEN_PEER_URLS=https://192.168.18.3:2380
ETCD_INITIAL_ADVERTISE_PEER_URLS=https://192.168.18.3:2380

ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
ETCD_INITIAL_CLUSTER="etcd1=https://192.168.18.3:2380,etcd2=https://192.168.18.4:2380,etcd3=https://192.168.18.6:2380"
ETCD_INITIAL_CLUSTER_STATE=existing

192.168.18.4服务器中的/etc/etcd/etcd.conf

# /etc/etcd/etcd.conf - node 1
ETCD_NAME=etcd2
ETCD_DATA_DIR=/etc/etcd/data

ETCD_CERT_FILE=/etc/etcd/pki/etcd_server.crt
ETCD_KEY_FILE=/etc/etcd/pki/etcd_server.key
ETCD_TRUSTED_CA_FILE=/etc/kubernetes/pki/ca.crt
ETCD_CLIENT_CERT_AUTH=true
ETCD_LISTEN_CLIENT_URLS=https://192.168.18.4:2379
ETCD_ADVERTISE_CLIENT_URLS=https://192.168.18.4:2379
ETCD_PEER_CERT_FILE=/etc/etcd/pki/etcd_server.crt
ETCD_PEER_KEY_FILE=/etc/etcd/pki/etcd_server.key
ETCD_PEER_TRUSTED_CA_FILE=/etc/kubernetes/pki/ca.crt
ETCD_LISTEN_PEER_URLS=https://192.168.18.4:2380
ETCD_INITIAL_ADVERTISE_PEER_URLS=https://192.168.18.4:2380

ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
ETCD_INITIAL_CLUSTER="etcd1=https://192.168.18.3:2380,etcd2=https://192.168.18.4:2380,etcd3=https://192.168.18.5:2380"
ETCD_INITIAL_CLUSTER_STATE=existing

192.168.18.5服务器中的/etc/etcd/etcd.conf

# /etc/etcd/etcd.conf - node 1
ETCD_NAME=etcd2
ETCD_DATA_DIR=/etc/etcd/data

ETCD_CERT_FILE=/etc/etcd/pki/etcd_server.crt
ETCD_KEY_FILE=/etc/etcd/pki/etcd_server.key
ETCD_TRUSTED_CA_FILE=/etc/kubernetes/pki/ca.crt
ETCD_CLIENT_CERT_AUTH=true
ETCD_LISTEN_CLIENT_URLS=https://192.168.18.5:2379
ETCD_ADVERTISE_CLIENT_URLS=https://192.168.18.5:2379
ETCD_PEER_CERT_FILE=/etc/etcd/pki/etcd_server.crt
ETCD_PEER_KEY_FILE=/etc/etcd/pki/etcd_server.key
ETCD_PEER_TRUSTED_CA_FILE=/etc/kubernetes/pki/ca.crt
ETCD_LISTEN_PEER_URLS=https://192.168.18.5:2380
ETCD_INITIAL_ADVERTISE_PEER_URLS=https://192.168.18.5:2380

ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
ETCD_INITIAL_CLUSTER="etcd1=https://192.168.18.3:2380,etcd2=https://192.168.18.4:2380,etcd3=https://192.168.18.5:2380"
ETCD_INITIAL_CLUSTER_STATE=existing

启动并查看集群状态etcd集群

基于systemd的配置,在3台主机上分别启动etcd服务,并设置为开 机自启动:

systemctl restart etcd && systemctl enable etcd

然后用etcdctl客户端命令行工具携带客户端CA证书,运行etcdctl endpoint health命令访问etcd集群,验证集群状态是否正常,命令如下:

etcdctl --cacert=/etc/kubernetes/pki/ca.crt \
--cert=/etc/etcd/pki/etcd_client.crt \
--key=/etc/etcd/pki/etcd_client.key \
--endpoints=https://192.168.18.3:2379,https://192.168.18.4:2379,https://192.168.18.5:2379 endpoint health

在这里插入图片描述

部署安全的Kubernetes Master高可用集群

下载Kubernetes服务的二进制文件
首先,从Kubernetes的官方GitHub代码库页面下载各组件的二进制 文件,在Releases页面找到需要下载的版本号,单击CHANGELOG链 接,跳转到已编译好的Server端二进制(Server Binaries)文件的下载页
面进行下载

下载路径:https://github.com/kubernetes/kubernetes/releases/tag/v1.19.0

在这里插入图片描述
在这里插入图片描述

分别下载Server Binaries和Node Binaries二进 制文件。
Server Binaries中包含不同系统架构的服务端可执行文件,例 如kubernetes-server-linux-amd64.tar.gz文件包含了x86架构下Kubernetes需 要运行的全部服务程序文件;
Node Binaries则包含了不同系统架构、不 同操作系统的Node需要运行的服务程序文件,包括Linux版和Windows版。

Kubernetes的Master节点上需要部署的服务包括:
etcd、kube- apiserver、kube-controller-manager和kube-scheduler

Kubernetes的工作节点(Worker Node)上需要部署的服务包括:
docker、kubelet 和kube-proxy。
将Kubernetes的二进制可执行文件复制到【/usr/bin目录下】,然后 在/usr/lib/systemd/system目录下为各服务创建systemd服务配置文件,这样就完成了软件的 安装。下面对每个服务的配置进行详细说明。

部署kube-apiserver服务

设置kube-apiserver服务需要的CA相关证书。准备 master_ssl.cnf文件用于生成x509 v3版本的证书【/etc/kubernetes/pki目录下】,示例如下:

[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[req_distinguished_name]
 
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
 
[alt_names]
DNS.1 = kubernetes
DNS.2 = kubernetes.default
DNS.3 = kubernetes.default.svc
DNS.4 = kubernetes.default.svc.cluster.local
DNS.5 = k8s-1
DNS.6 = k8s-2
DNS.7 = k8s-3
IP.1 = 169.169.0.1
IP.2 = 192.168.18.3
IP.3 = 192.168.18.4
IP.4 = 192.168.18.5
IP.5 = 192.168.6.100

在该文件中主要需要在subjectAltName字段([alt_names])设置 Master服务的全部域名和IP地址,包括:
◎ DNS主机名,例如k8s-1、k8s-2、k8s-3等;
◎ Master Service虚拟服务名称,例如kubernetes.default等;
◎ IP地址,包括各kube-apiserver所在主机的IP地址和负载均衡器 的IP地址,例如192.168.18.3、192.168.18.4、192.168.18.5和 192.168.18.100;
◎ Master Service虚拟服务的ClusterIP地址,例如169.169.0.1。
◎ IP.5:是负载均衡地址 此ip尽量不要和服务器ip段位一致,否则会出现问题一下问题
在这里插入图片描述

创建kube-apiserver的服务端CA证书

然后使用openssl命令创建kube-apiserver的服务端CA证书,包括 apiserver.key和apiserver.crt文件,将其保存到【/etc/kubernetes/pki目录下】:

# openssl genrsa -out apiserver.key 2048

# openssl req -new -key apiserver.key -config master_ssl.cnf -subj "/CN=192.168.18.3" -out apiserver.csr

# openssl x509 -req -in apiserver.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 36500 -extensions v3_req -extfile master_ssl.cnf -out apiserver.crt

为kube-apiserver服务创建systemd服务配置文件/usr/lib/systemd/system/kube-apiserver.service,内容如下:

[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes
 
[Service]
EnvironmentFile=/etc/kubernetes/apiserver
ExecStart=/usr/bin/kube-apiserver $KUBE_API_ARGS
Restart=always
 
[Install]
WantedBy=multi-user.target

注意:ExecStart=/usr/bin/kube-apiserver $KUBE_API_ARGS 中的kube-apiserver文件是下载好后的k8s文件,解压后的文件目录,找到/kubernetes/server/bin/kube-apiserver文件,并拷贝到/usr/bin/即可(后面类似文件都这么搞)
配置文件【/etc/kubernetes/apiserver】的内容通过环境变量 KUBE_API_ARGS设置kube-apiserver的全部启动参数,包含CA安全配 置的启动参数示例如下:

KUBE_API_ARGS="--insecure-port=0 \
--secure-port=6443 \
--tls-cert-file=/etc/kubernetes/pki/apiserver.crt \
--tls-private-key-file=/etc/kubernetes/pki/apiserver.key \
--client-ca-file=/etc/kubernetes/pki/ca.crt \
--apiserver-count=3 --endpoint-reconciler-type=master-count \
--etcd-servers=https://192.168.18.3:2379,https://192.168.18.4:2379,https://192.168.18.5:2379 \
--etcd-cafile=/etc/kubernetes/pki/ca.crt \
--etcd-certfile=/etc/etcd/pki/etcd_client.crt \
--etcd-keyfile=/etc/etcd/pki/etcd_client.key \
--service-cluster-ip-range=169.169.0.0/16 \ 
--service-node-port-range=30000-32767 \
--allow-privileged=true \
--logtostderr=false --log-dir=/var/log/kubernetes --v=0"

–secure-port:HTTPS端口号,默认值为6443。
–insecure-port:HTTP端口号,默认值为8080,设置为0表示关
闭HTTP访问。
–apiserver-count:API Server实例数量,例如3,需要同时设置
参数–endpoint-reconciler-type=master-count。
–service-cluster-ip-range:Service虚拟IP地址范围,以CIDR格
式表示,例如169.169.0.0/16,该IP范围不能与物理机的IP地址有重合。
–service-node-port-range:Service可使用的物理机端口号范
围,默认值为30000~32767。
–allow-privileged:是否允许容器以特权模式运行,默认值为
true。
–logtostderr:是否将日志输出到stderr,默认值为true,当使用
systemd系统时,日志将被输出到journald子系统。设置为false表示不输
出到stderr,可以输出到日志文件。
–log-dir:日志的输出目录,例如/var/log/kubernetes。
–v:日志级别。

在配置文件准备完毕后,分别在3台主机上分别启动kube-apiserver 服务,并设置为开机自启动:

systemctl start kube-apiserver && systemctl enable kube-apiserver
创建客户端CA证书

kube-controller-manager、kube-scheduler、kubelet和kube-proxy服务 作为客户端连接kube-apiserver服务,需要为它们创建客户端CA证书进 行访问。这里以对这几个服务统一创建一个证书作为示例:
通过openssl工具创建CA证书和私钥文件,命令如下:

# openssl genrsa -out client.key 2048
 
# openssl req -new -key client.key -subj "/CN=admin" -out client.csr
 
# openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 36500
 

其中,-subj参数中“/CN”的名称可以被设置为“admin”,用于标识连 接kube-apiserver的客户端用户的名称。
将生成的client.key和client.crt文件保存在【/etc/kubernetes/pki目录下】

创建客户端连接kube-apiserver服务所需的kubeconfig配置文件

为kube-controller-manager、kube-scheduler、kubelet和kube- proxy客户端服务统一创建一个kubeconfig文件作为连接kube-apiserver服务的配置文件;
后续也作为kubectl命令行工具连接kube-apiserver服务的配置文件。
在Kubeconfig文件中主要设置访问kube-apiserver的URL地址及所需 CA证书等的相关参数,示例如下:

apiVersion: v1
kind: Config
clusters:
- name: default
  cluster:
    server: https://192.168.6.100:9443
    certificate-authority: /etc/kubernetes/pki/ca.crt
users:
- name: admin
  user:
    client-certificate: /etc/kubernetes/pki/client.crt
    client-key: /etc/kubernetes/pki/client.key
contexts:
- context:
    cluster: default
    user: admin
  name: default
current-context: default

其中的关键配置参数如下:
◎ server URL地址:配置为负载均衡器(HAProxy)使用的VIP地 址(如192.168.18.100)和HAProxy监听的端口号(如9443)。
◎ client-certificate:配置为客户端证书文件(client.crt)全路径。
◎ client-key:配置为客户端私钥文件(client.key)全路径。
◎ certificate-authority:配置为CA根证书(ca.crt)全路径。
◎ users中的user name和context中的user:连接API Server的用户 名,设置为与客户端证书中的“/CN”名称保持一致,例如“admin”。
将kubeconfig文件保存到【/etc/kubernetes目录下】。

部署kube-controller-manager服务

为kube-controller-manager服务创建systemd服务配置文 件/usr/lib/systemd/system/kube-controller-manager.service,内容如下:

[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/kubernetes/kubernetes
 
[Service]
EnvironmentFile=/etc/kubernetes/controller-manager
ExecStart=/usr/bin/kube-controller-manager $KUBE_CONTROLLER_MANAGER_ARGS
Restart=always
 
[Install]
WantedBy=multi-user.target

配置文件/etc/kubernetes/controller-manager的内容为通过环境 变量KUBE_CONTROLLER_MANAGER_ARGS调用参数,包含CA安全配置的启动参数示例如下:

KUBE_CONTROLLER_MANAGER_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig \
--leader-elect=true \
--service-cluster-ip-range=169.169.0.0/16 \
--service-account-private-key-file=/etc/kubernetes/pki/apiserver.key \
--root-ca-file=/etc/kubernetes/pki/ca.crt \
--log-dir=/var/log/kubernetes --logtostderr=false --v=0"

对主要参数说明如下:
◎ --kubeconfig:与API Server连接的相关配置。
◎ --leader-elect:启用选举机制,在3个节点的环境中应被设置为 true。
◎ --service-account-private-key-file:为ServiceAccount自动颁发 token使用的私钥文件全路径,例如/etc/kubernetes/pki/apiserver.key。
◎ --root-ca-file:CA根证书全路径,例 如/etc/kubernetes/pki/ca.crt。
◎ --service-cluster-ip-range:Service虚拟IP地址范围,以CIDR格 式表示,例如169.169.0.0/16,与kube-apiserver服务中的配置保持一致。
将controller-manager文件保存到【/etc/kubernetes目录下】。

配置文件准备完毕后,在3台主机上分别启动kube-controller- manager服务,并设置为开机自启动

systemctl start kube-controller-manager && systemctl enable kube-controller-manager

部署kube-scheduler服务

为kube-scheduler服务创建systemd服务配置文 件/usr/lib/systemd/system/kube-scheduler.service,内容如下:

[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/kubernetes/kubernetes
 
[Service]
EnvironmentFile=/etc/kubernetes/scheduler
ExecStart=/usr/bin/kube-scheduler $KUBE_SCHEDULER_ARGS
Restart=always
 
[Install]
WantedBy=multi-user.target

配置文件/etc/kubernetes/scheduler的内容为通过环境变量 KUBE_SCHEDULER_ARGS设置的kube-scheduler的全部启动参数,示 例如下:

KUBE_SCHEDULER_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig \
--leader-elect=true \
--logtostderr=false --log-dir=/var/log/kubernetes --v=0"

对主要参数说明如下。
◎ --kubeconfig:与API Server连接的相关配置。
◎ --leader-elect:启用选举机制,在3个节点的环境中应被设置为 true。
将scheduler文件保存到【/etc/kubernetes目录下】。
在配置文件准备完毕后,在3台主机上分别启动kube-scheduler服务,并设置为开机自启动:

systemctl start kube-scheduler && systemctl enable kube-scheduler

通过systemctl status <service_name>验证服务的启动状态,状态为 running并且没有报错日志表示启动成功,例如:
在这里插入图片描述

使用HAProxy和keepalived部署高可用负载均衡器

使用HAProxy和keepalived部署高可用负载均衡器

接下来,在3个kube-apiserver服务的前端部署HAProxy和 keepalived,使用VIP 192.168.18.100作为Master的唯一入口地址,供客 户端访问。
将HAProxy和keepalived均部署为至少有两个实例的高可用架构,以 避免单点故障。下面以在192.168.18.3和192.168.18.4两台服务器上部署 为例进行说明。
HAProxy负责将客户端请求转发到后端的3个kube- apiserver实例上,keepalived负责维护VIP 192.168.18.100的高可用。
HAProxy和keepalived的部署架构如图:
在这里插入图片描述
接下来对部署HAProxy和keepalived组件进行说明。

部署两个HAProxy实例

注意:haproxy是对kube-apiserver(端口6443 )服务进行负载!!!

准备HAProxy的配置文件haproxy.cfg,【/etc/kubernetes/haproxy.cfg 】内容示例如下:

global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4096
    user        haproxy
    group       haproxy
    daemon
    stats socket /var/lib/haproxy/stats
 
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option                  http-server-close
    option                  forwardfor    except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000
 
frontend  kube-apiserver
    mode                 tcp
    bind                 *:9443 #代理kube_apiserver的端口
    option               tcplog
    default_backend      kube-apiserver
 
listen stats
    mode                 http
    bind                 *:8888 #访问haproxy的web界面端口
    stats auth           admin:password
    stats refresh        5s
    stats realm          HAProxy\ Statistics
    stats uri            /stats
    log                  127.0.0.1 local3 err
 
backend kube-apiserver
    mode        tcp
    balance     roundrobin
    server  k8s-master1 192.168.18.3:6443 check
    server  k8s-master2 192.168.18.4:6443 check
    server  k8s-master3 192.168.18.5:6443 check

对主要参数说明如下。
◎ frontend:HAProxy的监听协议和端口号,使用TCP,端口号为 9443。
◎ backend:后端3个kube-apiserver的地址,以IP:Port方式表 示,例如192.168.18.3:6443、192.168.18.4:6443和192.168.18.5: 6443;mode字段用于设置协议,此处为tcp;balance字段用于设置负载 均衡策略,例如roundrobin为轮询模式。
◎ listen stats:状态监控的服务配置,其中,bind用于设置监听端 口号为8888;stats auth用于配置访问账号;stats uri用于配置访问URL路 径,例如/stats。

下面以Docker容器方式运行HAProxy且镜像使用 haproxytech/haproxy-debian为例进行说明。 在两台服务器192.168.18.3和192.168.18.4上启动HAProxy,将配置 文件haproxy.cfg挂载到容器的/usr/local/etc/haproxy目录下,启动命令如 下:
安装docker省略,docker版本19.03.13

docker run -d --name k8s-haproxy --net=host \
--restart=always -v /etc/kubernetes/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro \
haproxytech/haproxy-debian:2.3

在一切正常的情况下,通过浏览器访问http://192.168.18.3: 8888/stats地址即可访问HAProxy的管理页面,登录后查看到的主页界面
在这里插入图片描述
这里主要关注最后一个表格,其内容为haproxy.cfg配置文件中 backend配置的3个kube-apiserver地址,它们的状态均为“UP”,表示与3 个kube-apiserver服务成功建立连接,说明HAProxy工作正常

部署两个keepalived实例

Keepalived用于维护VIP地址的高可用,同样在192.168.18.3和 192.168.18.4两台服务器上进行部署。
主要需要配置keepalived监控 HAProxy的运行状态,当某个HAProxy实例不可用时,自动将VIP地址 切换到另一台主机上。下面对keepalived的配置和启动进行说明。

在第1台服务器192.168.18.3上创建配置文件keepalived.conf,内容如下【/etc/kubernetes/keepalived.conf】:

! Configuration File for keepalived
 
global_defs {
   router_id LVS_1
}
 
vrrp_script checkhaproxy
{
    script "/usr/bin/check-haproxy.sh"
    interval 2
    weight -30
}
 
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
 
    virtual_ipaddress {
        192.168.18.100/24 dev ens33
    }
 
    authentication {
        auth_type PASS
        auth_pass password
    }
 
    track_script {
        checkhaproxy
    }
}

主要参数在vrrp_instance段中进行设置,说明如下。
◎ vrrp_instance VI_1:设置keepalived虚拟路由器VRRP的名称。
◎ state:设置为“MASTER”,将其他keepalived均设置 为“BACKUP”。
◎ interface:待设置VIP地址的网卡名称。
◎ virtual_router_id:例如51。
◎ priority:优先级,例如100。
◎ virtual_ipaddress:VIP地址,例如192.168.18.100/24。
◎ authentication:访问keepalived服务的鉴权信息。
◎ track_script:HAProxy健康检查脚本。

Keepalived需要持续监控HAProxy的运行状态,在某个HAProxy实 例运行不正常时,自动切换到运行正常的HAProxy实例上。需要创建一 个HAProxy健康检查脚本,定期运行该脚本进行监控,例如新建脚本 check-haproxy.sh并将其保存到【/usr/bin目录下】,内容示例如下:

#!/bin/bash
 
count=`netstat -apn | grep 9443 | wc -l`
 
if [ $count -gt 0 ]; then
    exit 0
else
    exit 1
fi

注意:记得赋予可执行权限 chmod +x /usr/bin/check-haproxy.sh

若检查成功,则应返回0;若检查失败,则返回非0值。Keepalived 根据上面的配置,会每隔2s检查一次HAProxy的运行状态。例如,如果 在192.168.18.3 上检查失败,keepalived就会将VIP地址切换到正常运行 HAProxy的192.168.18.4服务器上,保证VIP 192.168.18.100地址的高可 用。

在第2台服务器192.168.18.4上创建配置文件keepalived.conf,内容示 例如下【 /etc/kubernetes/keepalived.conf】:

! Configuration File for keepalived
 
global_defs {
   router_id LVS_2
}
 
vrrp_script checkhaproxy
{
    script "/usr/bin/check-haproxy.sh"
    interval 2
    weight -30
}
 
vrrp_instance VI_1 {
 
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
 
    virtual_ipaddress {
        192.168.18.100/24 dev ens33
    }
 
    authentication {
        auth_type PASS
        auth_pass password
    }
 
    track_script {
        checkhaproxy
    }
}

keepalived集群中只能有一个被设置为“MASTER”。如果keepalived集群 不止2个实例,那么除了MASTER,其他都应被设置为“BACKUP”。
◎ vrrp_instance的值“VI_1”需要与MASTER的配置相同,表示它 们属于同一个虚拟路由器组(VRRP),当MASTER不可用时,同组的 其他BACKUP实例会自动选举出一个新的MASTER。
◎ HAProxy健康检查脚本check-haproxy.sh与第1个keepalived的相 同。

下面以Docker容器方式运行HAProxy且镜像使用osixia/keepalived为 例进行说明。在两台服务器192.168.18.3和192.168.18.4上启动 HAProxy,将配置文件keepalived.conf挂载到容器 的/container/service/keepalived/assets目录下,启动命令如下:

docker run -d --name k8s-keepalived \
--restart=always --net=host \
--cap-add=NET_ADMIN --cap-add=NET_BROADCAST --cap-add=NET_RAW \
-v /etc/kubernetes/keepalived.conf:/container/service/keepalived/assets/keepalived.conf \
-v /usr/bin/check-haproxy.sh:/usr/bin/check-haproxy.sh \
osixia/keepalived:2.0.20 --copy-service

在运行正常的情况下,keepalived会在服务器192.168.18.3的网卡 ens33上设置192.168.18.100的IP地址,同样在服务器192.168.18.3上运行 的HAProxy将在该IP地址上监听9443端口号,对需要访问Kubernetes Master的客户端提供负载均衡器的入口地址,即192.168.18.100:9443。
通过ip addr命令查看服务器192.168.18.3的IP地址信息,可以看到在 ens33网卡上新增了192.168.18.100地址:
在这里插入图片描述
使用curl命令即可验证通过HAProxy的192.168.18.100:9443地址是 否可以访问到kube-apiserver服务:
在这里插入图片描述
可以看到TCP/IP连接创建成功,得到响应码为401的应答,说明通 过VIP地址192.168.18.100成功访问到了后端的kube-apiserver服务。
至 此,Master上所需的3个服务就全部启动完成了。接下来就可以部署 Node的服务了。

部署Node的服务

在Node上需要部署Docker、kubelet、kube-proxy,在成功加入 Kubernetes集群后,还需要部署CNI网络插件、DNS插件等管理组件。
主要对如何部署 kubelet和kube-proxy进行说明。 以将192.168.18.3、192.168.18.4和192.168.18.5三台主机部署为 Node为例进行说明,由于这三台主机都是Master节点,所以最终部署结 果为一个包含三个Node节点的Kubernetes集群。

部署kubelet服务

为kubelet服务创建systemd服务配置文 件/usr/lib/systemd/system/kubelet.service,内容如下:


[Unit]
Description=Kubernetes Kubelet Server
Documentation=https://github.com/kubernetes/kubernetes
After=docker.target
 
[Service]
EnvironmentFile=/etc/kubernetes/kubelet
ExecStart=/usr/bin/kubelet $KUBELET_ARGS
Restart=always
 
[Install]
WantedBy=multi-user.target

配置文件/etc/kubernetes/kubelet的内容为通过环境变量 KUBELET_ARGS设置的kubelet的全部启动参数,示例如下:

KUBELET_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig --config=/etc/kubernetes/kubelet.config \
--hostname-override=192.168.18.3 \
--network-plugin=cni \
--logtostderr=false --log-dir=/var/log/kubernetes --v=0"

对主要参数说明如下。
◎ --kubeconfig:设置与API Server连接的相关配置,可以与kube-controller-manager使用的kubeconfig文件相同。需要将相关客户端证书文 件从Master主机复制到Node主机的/etc/kubernetes/pki目录下,例如 ca.crt、client.key、client.crt文件。
◎ --config:kubelet配置文件,从Kubernetes 1.10版本开始引入, 设置可以让多个Node共享的配置参数,例如address、port、 cgroupDriver、clusterDNS、clusterDomain等。关于kubelet.config文件中 可以设置的参数内容和详细说明,请参见官方文档的说明。
◎ --hostname-override:设置本Node在集群中的名称,默认值为 主机名,应将各Node设置为本机IP或域名。
◎ --network-plugin:网络插件类型,建议使用CNI网络插件。
kubelet文件保存在【/etc/kubernetes/kubelet】路径下。

配置文件kubelet.config的内容示例如下:

kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: 0.0.0.0
port: 10250
cgroupDriver: cgroupfs
clusterDNS: ["169.169.0.100"]
clusterDomain: cluster.local
authentication:
  anonymous:
    enabled: true

在本例中设置的kubelet参数如下。
◎ address:服务监听IP地址。
◎ port:服务监听端口号,默认值为10250。
◎ cgroupDriver:设置为cgroupDriver驱动,默认值为cgroupfs, 可选项包括systemd。
◎ clusterDNS:集群DNS服务的IP地址,例如169.169.0.100。
◎ clusterDomain:服务DNS域名后缀,例如cluster.local。
◎ authentication:设置是否允许匿名访问或者是否使用webhook 进行鉴权。
kubelet.config文件保存到【/etc/kubernetes/kubelet.config】目录下。

在配置文件准备完毕后,在各Node主机上启动kubelet服务并 设置为开机自启动:

systemctl start kubelet && systemctl enable kubelet

部署kube-proxy服务

为kube-proxy服务创建systemd服务配置文 件/usr/lib/systemd/system/kube-proxy.service,内容如下:

[Unit]
Description=Kubernetes Kube-Proxy Server
Documentation=https://github.com/kubernetes/kubernetes
After=network.target
 
[Service]
EnvironmentFile=/etc/kubernetes/proxy
ExecStart=/usr/bin/kube-proxy $KUBE_PROXY_ARGS
Restart=always
 
[Install]
WantedBy=multi-user.target

配置文件【/etc/kubernetes/proxy】的内容为通过环境变量 KUBE_PROXY_ARGS设置的kube-proxy的全部启动参数,示例如下:

KUBE_PROXY_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig \
--hostname-override=192.168.18.3 \
--proxy-mode=iptables \
--logtostderr=false --log-dir=/var/log/kubernetes --v=0"

对主要参数说明如下。
◎ --kubeconfig:设置与API Server连接的相关配置,可以与 kubelet使用的kubeconfig文件相同。相关客户端CA证书使用部署kubelet 服务时从Master主机复制到Node主机的/etc/kubernetes/pki目录下的文 件,包括ca.crt、client.key和client.crt。
◎ --hostname-override:设置本Node在集群中的名称,默认值为 主机名,各Node应被设置为本机IP或域名。
◎ --proxy-mode:代理模式,包括iptables、ipvs、 kernelspace(Windows节点使用)等。

在配置文件准备完毕后,在各Node主机上启动kube-proxy服 务,并设置为开机自启动:

systemctl start kube-proxy && systemctl enable kube-proxy

Master上通过kubectl验证Node信息

在各个Node的kubelet和kube-proxy服务正常启动之后,会将本Node 自动注册到Master上,然后就可以到Master主机上通过kubectl查询自动 注册到Kubernetes集群的Node的信息了。
由于Master开启了HTTPS认证,所以kubectl也需要使用客户端CA证 书连接Master,可以直接使用kube-controller-manager的kubeconfig文 件,命令如下:

首先,去/kubernetes/server/bin拷贝kubectl到/usr/bin/目录下才可以用
把kubernetes配置文件加入到环境变量中

echo "export KUBECONFIG=/etc/kubernetes/kubeconfig" >> /etc/profile

然后刷新配置
source /etc/profile
通过命令查看工作节点
kubectl get nodes
在这里插入图片描述
我们可以看到各Node的状态为“NotReady”,这是因为还没有部署 CNI网络插件,无法设置容器网络。
类似于通过kubeadm创建Kubernetes集群,例如选择Calico CNI插件 运行下面的命令一键完成CNI网络插件的部署:

在其中一个master上执行就好了!
安装calico
curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O
kubectl apply -f calico.yaml

在这里插入图片描述

注意,如果出现无法变更Ready状态请查看:
关于二进制安装k8s 使用calico网络插件出现NotReady问题

为了使Kubernetes集群正常工作,我们还需要部署DNS服务,建议 使用CoreDNS进行部署。后面会讲解。参考地址:https://editor.csdn.net/md/?articleId=130225127
至此,一个有三个Master节点的高可用Kubernetes集群就部署完成 了,接下来用户就可以创建Pod、Deployment、Service等资源对象来部 署、管理容器应用和微服务了。

重启服务命令
systemctl restart kube-apiserver
systemctl restart kube-controller-manager
systemctl restart kube-scheduler
systemctl restart kubelet
systemctl restart kube-proxy

状态查看
systemctl status kube-apiserver
systemctl status kube-controller-manager
systemctl status kube-scheduler
systemctl status kubelet
systemctl status kube-proxy

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值