centos7.9 二进制编译安装 kubernetes 集群

本文章根据《kubernetes权威指南第5版》操作的,结合网上其他大神的笔记,排除了诸多不明和错误的地方,途中遇到了很多问题,踩坑无数。所以写一篇博客记录一下,希望给看到的人提供一个正确的方向。

有一种情况:当你的工作环境在公司内网,出于各种安全限制,服务器不能连接公网的时候,安装各种软件都必须要使用二进制编译安装。这对k8s集群来说,本来可以使用docker pull下载安装的镜像,就必须将所有需要的包从公网上下载后传到服务器上才能装好。

第一步:基础环境配置,所有服务器上都要执行。 

K8S集群角色IP主机名安装的组件
Master1192.168.206.136k8s-master1apiserver、controller-manager、scheduler、etcd、docker
Master2192.168.206.137k8s-master2apiserver、controller-manager、scheduler、etcd、docker
Master3192.168.206.138k8s-master3apiserver、controller-manager、scheduler、etcd、docker
Node1192.168.206.136k8s-master1kubelet、kube-proxy、docker、calico、cordns
Node2192.168.206.137k8s-master2kubelet、kube-proxy、docker、calico、cordns
Node3192.168.206.138k8s-master3kubelet、kube-proxy、docker、calico、cordns
VIP192.168.206.200控制节点的vip地址
haproxy192.168.206.141proxy1haproxy、keepalived
haproxy192.168.206.142proxy1haproxy、keepalived
1,配置主机名和hosts
echo "192.168.206.136	k8s-master1" >>/etc/hosts
echo "192.168.206.137	k8s-master2" >>/etc/hosts
echo "192.168.206.138	k8s-master3" >>/etc/hosts


136:
hostname k8s-master1
echo k8s-master1 > /etc/hostname

137:
hostname k8s-master2
echo k8s-master2 > /etc/hostname

138:
hostname k8s-master3
echo k8s-master3 > /etc/hostname



2,配置yum
yum clean all
yum repolist

3,配置防火墙和系统基础环境
systemctl stop firewalld && systemctl disable firewalld
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
setenforce 0
swapoff -a
yes | cp /etc/fstab /etc/fstab_bak 
cat /etc/fstab_bak |grep -v swap > /etc/fstab
 

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
 
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
sysctl --system 

4,安装docker
yum -y install docker
mv /etc/docker/daemon.json /etc/docker/daemon.conf
#然后修改daemon.json,添加加速镜像,这个地址是我私人的,建议自己注册一个,否则可能不能用:
vim /etc/docker/daemon.json
 
{
         "exec-opts": ["native.cgroupdriver=systemd"],
         "registry-mirrors": ["https://wyrsf017.mirror.aliyuncs.com"]
}

systemctl daemon-reload
systemctl start docker
systemctl enable docker
docker version

第二步: 配置master节点到node节点的免密,方便传输文件

master1 136上:

ssh-keygen

一路回车,生成秘钥,然后:

ssh-copy-id 192.168.206.137
ssh-copy-id 192.168.206.138

第三步:创建etcd master高可用部署架构

master节点在kubernetes集群中扮演着总控的重要角色,如果master不能工作,则node节点将处于不可管理状态,所以,只要需要3个节点的多实例部署。并启用基于CA的HTTPS安全认证机制。

1,在master1 136上生成CA证书,并将证书传到137和138上。这一步很重要,后续的证书都是通过这个CA签发的,三台要一样的证书,否则会报错。

三个节点先要创建存放证书的目录:

mkdir -p /etc/kubernetes/pki
#然后在master1 136上:
cd /etc/kubernetes/pki
openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -subj "/CN=192.168.206.136" -days 36500 -out ca.crt
scp -rp * 192.168.206.137:/etc/kubernetes/pki
scp -rp * 192.168.206.138:/etc/kubernetes/pki

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

2,三台master节点部署etcd高可用集群(3台都要做哦)

        1)从官网下载etcd二进制文件,使用V3.4.13版本

下载地址:https://github.com/etcd-io/etcd/releases/download/v3.4.13/etcd-v3.4.13-linux-amd64.tar.gz

mkdir -p  /data01/k8s
cd /data01/k8s

将该包传到136,137,138 的 /data01/k8s下,并解压。然后将解压目录下的etcd和etcdctl拷贝到/usr/bin下,

tar -xf etcd-v3.4.13-linux-amd64.tar.gz
cd etcd-v3.4.13-linux-amd64/
cp -rp etcd etcdctl /usr/bin

        2) 然后将其部署为一个systemd的服务,在三台上分别创建systemd服务配置文件/usr/lib/systemd/system/etcd.service,内容示例如下:

vim /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

        3)三台master创建etcd的CA证书

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

cd /etc/kubernetes/pki/
vim etcd_ssl.cnf
[ 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.206.136
IP.2 = 192.168.206.137
IP.3 = 192.168.206.138

        4)三台master创建etcd服务端CA证书,包括 etcd_server.key和etcd_server.crt文件,将其保存到【/etc/etcd/pki目录下】

cd /etc/kubernetes/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
cp -rp etcd_server.crt etcd_server.key etcd_server.csr /etc/etcd/pki/

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

cd /etc/kubernetes/pki/
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
cp -rp etcd_client.crt etcd_client.csr etcd_client.key /etc/etcd/pki/

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

mkdir -p /etc/etcd/
vim /etc/etcd/etcd.conf

192.168.206.136服务器中的/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.206.136:2379
ETCD_ADVERTISE_CLIENT_URLS=https://192.168.206.136: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.206.136:2380
ETCD_INITIAL_ADVERTISE_PEER_URLS=https://192.168.206.136:2380

ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
ETCD_INITIAL_CLUSTER="etcd1=https://192.168.206.136:2380,etcd2=https://192.168.206.137:2380,etcd3=https://192.168.206.138:2380"
ETCD_INITIAL_CLUSTER_STATE=new

192.168.206.137服务器中的/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.206.137:2379
ETCD_ADVERTISE_CLIENT_URLS=https://192.168.206.137: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.206.137:2380
ETCD_INITIAL_ADVERTISE_PEER_URLS=https://192.168.206.137:2380

ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
ETCD_INITIAL_CLUSTER="etcd1=https://192.168.206.136:2380,etcd2=https://192.168.206.137:2380,etcd3=https://192.168.206.138:2380"
ETCD_INITIAL_CLUSTER_STATE=new

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

# /etc/etcd/etcd.conf - node 1
ETCD_NAME=etcd3
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.206.138:2379
ETCD_ADVERTISE_CLIENT_URLS=https://192.168.206.138: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.206.138:2380
ETCD_INITIAL_ADVERTISE_PEER_URLS=https://192.168.206.138:2380

ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
ETCD_INITIAL_CLUSTER="etcd1=https://192.168.206.136:2380,etcd2=https://192.168.206.137:2380,etcd3=https://192.168.206.138:2380"
ETCD_INITIAL_CLUSTER_STATE=new

        7)启动并查看集群状态etcd集群,基于systemd的配置,在3台主机上分别启动etcd服务,并设置为开 机自启动:

systemctl daemon-reload
systemctl restart etcd
systemctl enable etcd

错误1:如果报错:Failed to restart etcd.service: Unit not found.

 就是以上需要在etcd需要在3台master上安装,但实际上,你只装了第一台。以上前5步,三个master都要做,第6步,各有不同。配置文件除了IP其他的不要改变,否则不通哦!

        8)用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.206.136:2379,https://192.168.206.137:2379,https://192.168.206.138:2379 endpoint health

    正常情况下,会显示    successfully

 如果遇见以下错误:

{"level":"warn","ts":"2022-11-25T13:55:27.988+0800","caller":"clientv3/retry_interceptor.go:62","msg":"retrying of unary invoker failed","target":"endpoint://client-10e52daa-cc22-4e4c-b459-cd6bfef78001/192.168.206.136:2379","attempt":0,"error":"rpc error: code = DeadlineExceeded desc = context deadline exceeded"}
{"level":"warn","ts":"2022-11-25T13:55:27.988+0800","caller":"clientv3/retry_interceptor.go:62","msg":"retrying of unary invoker failed","target":"endpoint://client-f0796440-71da-4762-b8dc-b2951eebd589/192.168.206.138:2379","attempt":0,"error":"rpc error: code = DeadlineExceeded desc = context deadline exceeded"}
{"level":"warn","ts":"2022-11-25T13:55:27.989+0800","caller":"clientv3/retry_interceptor.go:62","msg":"retrying of unary invoker failed","target":"endpoint://client-9f1ba359-a14d-4a14-a938-e2f317a88b54/192.168.206.137:2379","attempt":0,"error":"rpc error: code = DeadlineExceeded desc = context deadline exceeded"}
 

 则是因为上面前7步的操作有问题,网上各种文章都有较多的错误,一定要辩证对待。

第四步:部署安全的Kubernetes Master高可用集群

        1)下载Kubernetes服务的二进制文件,分别下载Server Binaries和Node Binaries二进 制文件。

https://dl.k8s.io/v1.19.0/kubernetes-client-darwin-amd64.tar.gz

https://dl.k8s.io/v1.19.0/kubernetes-server-linux-amd64.tar.gz

将下好的包传到三台master的/data01/k8s/目录下,然后解压,并拷贝可执行文件到/usr/bin下

cd /data01/k8s/
tar -xf kubernetes-server-linux-amd64.tar.gz
cd /data01/k8s/kubernetes/server/bin
cp -rp kubeadm kube-aggregator kube-apiserver kube-controller-manager kubectl kubelet kube-proxy kube-scheduler mounter apiextensions-apiserver /usr/bin

        2) 部署 kube-apiserver

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

cd /etc/kubernetes/pki
vim master_ssl.cnf
[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-master1
DNS.6 = k8s-master2
DNS.7 = k8s-master3
IP.1 = 169.169.0.1
IP.2 = 192.168.206.136
IP.3 = 192.168.206.137
IP.4 = 192.168.206.138
IP.6 = 192.168.206.200

在该文件中主要需要在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。


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

openssl genrsa -out apiserver.key 2048
openssl req -new -key apiserver.key -config master_ssl.cnf -subj "/CN=192.168.206.136" -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
openssl genrsa -out apiserver.key 2048
openssl req -new -key apiserver.key -config master_ssl.cnf -subj "/CN=192.168.206.137" -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

     

openssl genrsa -out apiserver.key 2048
openssl req -new -key apiserver.key -config master_ssl.cnf -subj "/CN=192.168.206.138" -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

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

vim /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

        5) 配置文件【/etc/kubernetes/apiserver】的内容通过环境变量 KUBE_API_ARGS设置kube-apiserver的全部启动参数,包含CA安全配 置的启动参数示例如下:

vim /etc/kubernetes/apiserver
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=2 --endpoint-reconciler-type=master-count \
--etcd-servers=https://192.168.206.136:2379,https://192.168.206.137:2379,https://192.168.206.138: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"

        6) 以上5步再三台master上都完成后,再开始第6步。在配置文件准备完毕后,分别在3台主机上分别启动kube-apiserver 服务,并设置为开机自启动:

systemctl start kube-apiserver 
systemctl enable kube-apiserver
systemctl status kube-apiserver

         7)创建客户端CA证书

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

cd /etc/kubernetes/pki
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

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

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

vim /etc/kubernetes/kubeconfig
apiVersion: v1
kind: Config
clusters:
- name: default
  cluster:
    server: https://192.168.206.200: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.206.200)和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目录下】。
 

        9)部署kube-controller-manager服务

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

vim /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

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

vim /etc/kubernetes/controller-manager
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服务中的配置保持一致。


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

systemctl start kube-controller-manager 
systemctl enable kube-controller-manager
systemctl status kube-controller-manager

        12)部署kube-scheduler服务

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

vim /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

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

vim /etc/kubernetes/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。       

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

systemctl start kube-scheduler
systemctl enable kube-scheduler
systemctl status kube-scheduler

         15)使用HAProxy和keepalived部署高可用负载均衡器,这里我是自己装的,不是说书上用的镜像。

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

         

        16)部署两个HAProxy实例,在192.168.206.140和192.168.206.141上部署

        初始化两台proxy服务器

hostname proxy1
echo proxy1 > /etc/hostname
echo 192.168.206.141 proxy1 >>/etc/hosts
hostname proxy2
echo proxy2 > /etc/hostname
echo 192.168.206.142 proxy2 >>/etc/hosts
yum -y install haproxy keepalived
vim /etc/haproxy/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
    option               tcplog
    default_backend      kube-apiserver

listen stats
    mode                 http
    bind                 *:8888
    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.206.136:6443 check
    server  k8s-master2 192.168.206.137:6443 check
    server  k8s-master3 192.168.206.138:6443 check

启动haproxy:

haproxy -f /etc/haproxy/haproxy.cfg
netstat -ano |grep 9443

使用 http://192.168.206.141:8888/stats 登录haproxy前台界面

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

141上修改keepalived的配置文件为:注意网卡名称要和实际上对应

vim /etc/keepalived/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 ens32
    virtual_router_id 51
    priority 100
    advert_int 1

    virtual_ipaddress {
        192.168.206.100/24 dev ens32
    }

    authentication {
        auth_type PASS
        auth_pass password
    }

    track_script {
        checkhaproxy
    }
}

设置141 keepalived的监控脚本

vim /usr/bin/check-haproxy.sh
chmod +x /usr/bin/check-haproxy.sh
# check-haproxy.sh
#!/bin/bash

count=`netstat -apn | grep 9443 | wc -l`

if [ $count -gt 0 ]; then
    exit 0
else
    exit 1
fi

142上修改keepalived的配置文件为:注意网卡名称要和实际上对应

vim /etc/keepalived/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 ens32
    virtual_router_id 51
    priority 100
    advert_int 1

    virtual_ipaddress {
        192.168.206.200/24 dev ens32
    }

    authentication {
        auth_type PASS
        auth_pass password
    }

    track_script {
        checkhaproxy
    }
}

设置142 keepalived的监控脚本,和141相同

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

        18)启动并检查keepalived服务的状态

systemctl start keepalived.service
systemctl enable keepalived.service
curl -v -k https://192.168.206.200:9443

 可以看到TCP/IP连接创建成功,得到响应码为401的应答,说明通 过VIP地址192.168.206.200成功访问到了后端的kube-apiserver服务。
至 此,Master上所需的3个服务就全部启动完成了。接下来就可以部署 Node的服务了。

第五步:部署Node的服务。按照书上的样例,将在3个master节点上部署node节点。

在Node上需要部署Docker、kubelet、kube-proxy,在成功加入 Kubernetes集群后,还需要部署CNI网络插件、DNS插件等管理组件。
主要对如何部署 kubelet和kube-proxy进行说明。 以将192.168.206.136、192.168.206.137和192.168.206.138三台主机部署为 Node为例进行说明,由于这三台主机都是Master节点,所以最终部署结 果为一个包含三个Node节点的Kubernetes集群。这里发现主机名和书上不一样,不过没关系了。

Node1192.168.206.136k8s-master1kubelet、kube-proxy、docker、calico、cordns
Node2192.168.206.137k8s-master2kubelet、kube-proxy、docker、calico、cordns
Node3192.168.206.138k8s-master3kubelet、kube-proxy、docker、calico、cordns

        1)三台部署kubelet服务,为kubelet服务创建systemd服务配置文 件/usr/lib/systemd/system/kubelet.service,内容如下:

vim /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

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

vim /etc/kubernetes/kubelet

136上

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

137上

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

138上

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

对主要参数说明如下。
◎ --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网络插件。
所以,需要将master 节点上的相关证书传到这两个node节点上在136上:

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

vim /etc/kubernetes/kubelet.config
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: 0.0.0.0
port: 10250
cgroupDriver: systemd
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 进行鉴权。
 

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

systemctl start kubelet
systemctl enable kubelet
systemctl status kubelet

         7)部署kube-proxy服务。

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

vim /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

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

vim /etc/kubernetes/proxy
#136
KUBE_PROXY_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig \
--hostname-override=192.168.206.136 \
--proxy-mode=iptables \
--logtostderr=false --log-dir=/var/log/kubernetes --v=0"
#137
KUBE_PROXY_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig \
--hostname-override=192.168.206.137 \
--proxy-mode=iptables \
--logtostderr=false --log-dir=/var/log/kubernetes --v=0"
#138
KUBE_PROXY_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig \
--hostname-override=192.168.206.138 \
--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节点使用)等。

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

systemctl restart kube-proxy
systemctl enable kube-proxy
systemctl status kube-proxy

 kube-proxy能启动成功,很不容易,这里踩了几个坑,已经更新到前面的配置中了。下面记录一下:

      (1)Failed to retrieve node info: nodes "k8s-master1" not found

 这一步,是说使用主机名连接不上导致的,配置文件为:/etc/kubernetes/kubelet

切记这里不能使用主机名,配置了hosts也不行 。

       (2)Failed to retrieve node info: nodes "192.168.206.137" not found。

明明是running,却偏偏要报这个node连接失败,查了一大圈,发现是kubelet没有起成功

找了很长时间,发现可以使用 kubelet 这个命令打印日志:

failed to run Kubelet: misconfiguration: kubelet cgroup driver: "cgroupfs" is different from docker cgroup driver: "systemd"

这个地方就是错误的症结所在,说是不建议使用cgroupfs,而是要使用systemd。

这里要修改docker和kubelet的配置文件

cp -rp /etc/docker/daemon.json /etc/docker/daemon.json.bak
mv /etc/docker/daemon.json /etc/docker/daemon.conf
vim /etc/docker/daemon.conf
#添加:"exec-opts": ["native.cgroupdriver=systemd"],
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": ["https://wyrsf017.mirror.aliyuncs.com"]
}

systemctl daemon-reload
systemctl restart docker


vim /etc/kubernetes/kubelet
#添加:--cgroup-driver=systemd
KUBELET_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig --config=/etc/kubernetes/kubelet.config \
--hostname-override=192.168.206.136 \
--network-plugin=cni \
--logtostderr=false --log-dir=/var/log/kubernetes --v=0 \
--cgroup-driver=systemd"

systemctl daemon-reload
systemctl restart kubelet

然后在重启以下kube-proxy,发现竟然解决了。

        10)Master上通过kubectl验证Node信息

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

echo "export KUBECONFIG=/etc/kubernetes/kubeconfig" >> /etc/profile
source /etc/profile
kubectl get nodes

 三台都要检查哦!

第六步:安装calico (这一步偷懒了,使用了镜像)

们可以看到各Node的状态为“NotReady”,这是因为还没有部署 CNI网络插件,无法设置容器网络。
类似于通过kubeadm创建Kubernetes集群,例如选择Calico CNI插件 运行下面的命令一键完成CNI网络插件的部署,3台都要装哦:

cd /data01/k8s
wget https://docs.projectcalico.org/v3.20/manifests/calico.yaml --no-check-certificate
kubectl apply -f calico.yaml

 然后重启服务:

systemctl restart kube-apiserver
systemctl restart kube-controller-manager.service
systemctl restart kube-scheduler
systemctl restart kubelet
systemctl restart kube-proxy

各路大神如果看了这篇文章,发现其中有错误的地方,欢迎联系我更改,谢谢!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值