1、安装要求

在开始之前,部署Kubernetes集群机器需要满足以下几个条件:
(1)一台或多台机器,操作系统Cent0S7.x-86x64
(2)硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB 或更多或更多
(3)集群中所有机器之间网络互通
(4)可以访问外网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点
(5)禁止swap分区

2、准备环境

 1、软件环境

软件版本
操作系统CentOS7.8 x64(mini)
Docker19-ce
Kubernetes1.19

2、服务器规划

角色IP组件
k8s-master192.168.31.71kube-apiserver,kube-controller-manager,kube-scheduler,etcd
k8s-node1192.168.31.72
kubelet,kube-proxy,docker,etcd
k8s-node2192.168.31.73kubelet,kube-proxy,docker,etcd

3、操作系统初始化

#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
#关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config#永久
setenforce 0#临时。
#关闭swap
swapoff-a #临时
sed -ri 's/.*swap.*/#&/' /etc/fstab#永久
#根据规划设置主机名。
hostnamectl set-hostname <hostname>
#在master添加hosts
cat >> /etc/hosts << EOF
192.168.31.71 k8s-master
192.168.31.72 k8s-node1
192.168.31.73 k8s-node2
EOF
#将桥接的IPv4流量传递到iptables的链
cat >> /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables=14
net.bridge.bridge-nf-call-iptables= 10
EOF
sysctl--system #生效。
#时间同步。
yum install ntpdate -yo
ntpdate time.windows.com

4、部署Etcd集群

Etcd是一个分布式键值存储系统,Kubernetes使用Etcd进行数据存储,所以先准备一个Etcd数据库,为解决Etcd单点故障,应采用集群方式部部署,这里使用3台组建集群,可容忍1台机器故障,当然,你也可以使用5台组建集群,可容忍2台机器故障。

节点名称IP
etcd-1192.168.31.71
etcd-2192.168.31.72
etcd-3192.168.31.73

注:为了节省机器,这里与K8s节点机器复用。也可以独立于k8s集群之外部署,只要apiserver能连接到就行。

1、准备cfssl证书生成工具。

cfssl是一个开源的证书管理工具,使用json文件生成证书,相比openssl更方便使用。找任意一台服务器操作,这里用Master节点。

wget https://pkg.cfssl.org/Rl.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget https://pkg.cfssl.org/Rl.2/cfssl-certinfo_linux-amd64
chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cifssl-certinfo_linux-amd64
mv cfssl_linux-amd64/usr/local/bin/cfssl
mv cfssljson_linux-amd64/usr/local/bin/cfssljson
mv cfssl-certinfo_linux-amd64/usr/bin/cfssl-certinfo

或把k8s资料包/集群/TLS.tar.gz上传服务器解压,以及生成证书

tar -zxvf TLS.tar.gz

生成证书 

2、生成Etcd证书(若是下载的文件)

1、自签证书颁发机构(CA) 

创建工作目录:

mkdir -p ~/TLS/{etcd,k8s}
cd TLS/etcd

自签CA: 

cat > ca-config.json << EOF
{
    "signing":{
        "default":{
            "expiry":"87600h"
        }
        "profiles":{
            "www":{
                "expiry":"87600h",
                "usages":[
                    "signing",
                    "key encipherment",
                    "serverauth", 
                    "client auth"
                 ]
            }
        }
    }
}
EOF
cat > ca-csr.json << EOF
{
    "CN":"etcd CA",
    "key":{
        "algo":"rsa",
        "size":2048
    },
    "names":[
        {
            "C":"CN",
            "L":"Beijing"
        }
    ]
}
EOF
            

生成证书:

cfssl gencert -initca ca-csr.json | cfssljson -bare  ca - 
ls *pem
ca-key.pem ca.pemo

2、使用自签CA签发Etcd HTTPS 证书

创建证书申请文件:
 

cat > server-csr.json << EOF
{
    "CN":"etcd",
    "hosts":[
    "192.168.31.71",
    "192.168.31.72",
    "192.168.31.73"
    ],
    "key":{
        "algo":"rsa",
        "size":2048
    },
    "names":[
        {
            "C":"CN",
            "L":"BeiJing",
            "ST":"BeiJing"
        }
    ]
}
EOF

注:上述文件hosts字段中IP为所有etcd节点的集群内部通信IP,一个都不能少!为了方便后期扩容可以多写几个预留的IP
 

生成证书

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -ceonfig=ca-config.json -profile=www server-csr.json | cfsslison -bare seerver
ls server*pem

3、从Github 下载二进制文件

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

4、部署Etcd集群

以下在节点1上操作,为简化操作,待会将节点1生成的所有有文件拷贝到节点2和节点3.

1、创建工作目录并解压二进制包
mkdir /opt/etcd/{bin,cfg,ssl} -p
tar -zxvf etcd-v3.4.9-linux-amd64.tar.gz
mv etcd-v3.4.9-linux-amd64/{etcd, etcdct1} /opt/etcd/bin/
2、 修改cfg/etcd.conf文件
vi /opt/etcd/cfg/etcd.conf
#[Member]
ETCD_NAME="etcd-1" #修改此处,节点2改为etcd-2,节点3改为etcd-3
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.31.71:2380"#修改此处为当前服务器IP
ETCD_LISTEN_CLIENT_URLS="https://192.168.31.71:2379"#修已改此处为当前服务器IP
#[Clustering]
ETCD INITIAL_ADVERTISE_PEER_URLS="https://192.168.31.71:2380"#修改此处为当前服务器IP
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.31.71:2379"#修改此处为当前服务器IP
ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.31.71:2380,etcd2=https://192.168.31.72:2380,etcd2=https://192.168.31.73:2380"
ETCD INITIAL CLUSTER_TOKEN="etcd-cluster"
ETCD INITIAL CLUSTER_STATE="new"
3、 创建/usr/lib/systemd/etcd.server文件
vi etcd.server
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target

[Service]
Type=notify
EnvironmentFile=/opt/etcd/cfg/etcd.conf
ExecStart=/opt/etcd/bin/etcd \
        --name=${ETCD_NAME} \
        --data-dir=${ETCD_DATA_DIR} \
        --listen-peer-urls=${ETCD_LISTEN_PEER_URLS} \
        --listen-client-urls=${ETCD_LISTEN_CLIENT_URLS},http://127.0.0.1:2379 \
        --advertise-client-urls=${ETCD_ADVERTISE_CLIENT_URLS} \
        --initial-advertise-peer-urls=${ETCD_INITIAL_ADVERTISE_PEER_URLS} \
        --initial-cluster=${ETCD_INITIAL_CLUSTER} \
        --initial-cluster-token=${ETCD_INITIAL_CLUSTER_TOKEN} \
        --initial-cluster-state=new \
        --cert-file=/opt/etcd/ssl/server.pem \
        --key-file=/opt/etcd/ssl/server-key.pem \
        --peer-cert-file=/opt/etcd/ssl/server.pem \
        --peer-key-file=/opt/etcd/ssl/server-key.pem \
        --trusted-ca-file=/opt/etcd/ssl/ca.pem \
        --peer-trusted-ca-file=/opt/etcd/ssl/ca.pem
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
 4、拷贝刚才生成的证书

把刚才生成的证书拷贝到配置文件中的路径:

cp ~/TLS/etcd/ca*pem ~/TLS/etcd/server.pem/opt/etcd/ssl
5、启动并设置开机启动
systemctl daemon-reload
systemctl start etcd
systemctl enable etcd
 6、将上面节点1所有生成的文件拷贝到节点2和节点3
scp -r /opt/etcd/ root@192.168.31.72:/opt/
scp /usr/lib/systemd/system/etcd.service root@192.168.31.72:/usr/lib/systemd/system/
scp -r /opt/etcd/ root@192.168.31.73:/opt/
scp /usr/lib/systemd/system/etcd.service root@192.168.31.73:/usr/lib/systemd/system/

然后在节点2和节点3分别修改etcd.conf配置文件中的节点名称和当前服务器IP:
 

vi /opt/etcd/cfg/etcd.conf
#[Member]
ETCD_NAME="etcd-1" #修改此处,节点2改为etcd-2,节点3改为etcd-3
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.31.71:2380"#修改此处为当前服务器IP
ETCD_LISTEN_CLIENT_URLS="https://192.168.31.71:2379"#修已改此处为当前服务器IP
#[Clustering]
ETCD INITIAL_ADVERTISE_PEER_URLS="https://192.168.31.71:2380"#修改此处为当前服务器IP
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.31.71:2379"#修改此处为当前服务器IP
ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.31.71:2380,etcd2=https://192.168.31.72:2380,etcd2=https://192.168.31.73:2380"
ETCD INITIAL CLUSTER_TOKEN="etcd-cluster"
ETCD INITIAL CLUSTER_STATE="new"

最后启动etcd并设置开机启动,同上。

7、查看集群状态
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/servyer-key.pem --
endpoints="https://192.168.31.71:2379, https://192.168.31.72:2379, https://192.16
8.31.73:2379" endpoint health
https://192.168.31.71:2379 is healthy: successfully committed proposal:took =8.154404ms
https://192.168.31.73:2379 is healthy: successfully committed proposal: took =9.044117ms
https://192.168.31.72:2379 is healthy: successfully committed proposal: took =10.000825ms

5、为APIServer自签证书(master)

为APIServer自签证书有两种操作方式:一是添加可信任IP列表,二是携带ca证书发送。这里我们采用添加可信任IP列表的方式。

 修改server-csr.json

执行sh脚本文件,生成自签证书

6、部署Master组件

1、从Github下载二进制文件

下载地址:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.18.md#v1183

注:打开链接你会发现里面有很多包,下载一个server包就饿够了,包含了Master和Worker Node二进制文件。

2、解压二进制包

mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
tar zxvf kubernetes-server-linux-amd64.tar.gz
cd kubernetes/server/bin.
cp kube-apiserver kube-scheduler kube-controller-mmanager /opt/kubernetes/bin
cp kubectl /usr/bin/

3、部署kube-apiserver

1、创建配置文件 
cat > /opt/kubernetes/cfg/kube-apiserver.conf << EOF
KUBE_APISERVER_OPTS="--logtostderr=false\\
--v=2 \\
--log-dir=/opt/kubernetes/logs \\
--etcd-servers=https://192.168.31.71:2379,https://192.168.31.72:2379, https://192.168.3
1.73:2379 \\
--bind-address=192.168.31.71 \\
--secure-port=6443 \\
--advertise-address=192.168.31.71 \\
--allow-privileged=true \\
--service-cluster-ip-range=10.0.0.0.0/24 \\
--enable-admission-plugins=NamespaceLifecycle, LimitRanger, ServiceAccount, ResourceQuota, NodeRestriction \\
--authorization-mode=RBAC,Node \\
--enable-bootstrap-token-auth=true \\
--token-auth-file=/opt/kubernetes/cfg/token.csv \\
--service-node-port-range=300000-32767 \\
--kubelet-client-certificate=/opt/kubernetes/ssl/server.pem \\
--kubelet-client-key=/opt/kubernetes/ssl/server-key.pem \\
--tls-cert-file=/opt/kubernetes/ssl/server.pem \\
--tls-private-key-file=/opt/kubernetes/ssl/server-key.pem \\
--client-ca-file=/opt/kubernetes/ssl/ca.pem \\
--service-account-key-file=/opt/kubernetes/ssl/ca-key.pem \\
--etcd-cafile=/opt/etcd/ssl/ca.pem \\
--etcd-keyfile=/opt/etcd/ssl/server-key.pem \\
--audit-log-maxage=30 \\
--audit-log-maxbackup=3 \\
--audit-log-maxsize=100 \\
--audit-log-path=/opt/kubernetes/logs/k8s-audit.log"
EOF

注:上面两个\\第一个是转义符,第二个是换行符,使用转义符是为了使用EOF保留换行符。

-logtostderr:启用日志

-v:日志等级

-log-dir:日志目录
-etcd-servers:etcd集群地址。
-bind-address:监听地址。
-secure-port:https安全端口。
-advertise-address:集群通告地址。
-allow-privileged:启用授权。
-service-cluster-ip-range:Service虚拟IP地址段

-enable-admission-plugins:准入控制模块
-authorization-mode:认证授权,启用RBAC授权和节点自管理

-enable-bootstrap-token-auth:启用TLS bootstrap:机制
-token-auth-file:bootstrap token文件。
-service-node-port-range:Service nodeport类型默认人分配端口范围
-kubelet-client-xxx:apiserver访问kubelet客户端证书。
-tls-xxx-file:apiserver https 证书。

-etcd-xxxfile:连接 Etcd集群证书。

-audit-log-xxx:审计日志。

2、拷贝刚才生成的证书

把刚才生成的证书拷贝到配置文件中的路径: 

cp ~/TLS/k8s/ca*pem ~/TLS/k8s/server*pem/opt/kubernetes/ssl/

 复制APIServer证书文件

删除当前无用的无用的证书(可不做) 

3、启动TLS Bootstrapping 机制

TLS Bootstraping:Master apiserver启用TLS认证后,Node节点kubelet和kube-proxy要与kube-apiserver进行通信,必须使用CA签发的有效证书才可以,当Node节点很多时,这种客户端证书颁发需要大量工作,同样也会增加集群扩展复杂度。为了简化流程,Kubernetes引入了TLS bootstraping机制来自动颁发客户端证书,kubelet会以一个低权限用户自动向apiserver申请证书,kubelet的证书由apiserver动态签署。所以强烈建议在Node上使用这种方式,目前主要用于kubelet,kube-proxy还是由我们统一颁发一个证书。

创建上述配置文件中token文件:

cat > /opt/kubernetes/cfg/token.csv << EOF
c47ffb939f5ca36231d9e3121a252940,kubelet-bootstrap,100011,"system:node-bootstrapper"
EOF

格式:token,用户名,UID,用户组。
token也可自行生成替换:

head -c 16 /dev/urandom | od -An -t x | tr -d ' '
 4、systemd管理apiserver
cat > /usr/lib/systemd/system/kube-apiserver.service << EOF
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=/opt/kubernetes/cfg/kube-apiserver.conf
ExecStart=/opt/kubernetes/bin/kube-apiserver \$KUBE_APISERVER_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
5、启动并设置开机启动
systemctldaemon-reload
systemctl start kube-apiserver
systemctl enable kube-apiserver
6、授权kubelet-bootstrap用户允许请求证书
kubectl create clusterrolebinding kubelet-bootstrap \
--clusterrole=system:node-bootstrapper \
--user=kubelet-bootstrap \

7、安装docker(node)

下载地址:https://download.docker.com/linux/sstatic/stable/x86_64/docker19.03.9.tgz
以下在所有节点操作。这里采用二进制安装,用yum安装也一样。

1、解压二进制包

tar zxvf docker-19.03.9.tgz.
mv docker/* /usr/bin

2、systemd 管理docker

cat > /usr/lib/systemd/system/docker.service << EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service containerd.service
Wants=network-online.target

[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process

[Install]
WantedBy=multi-user.target
EOF

 3、配置docker源

cat > /etc/docker/deamon.json <<EOF
{
    "registry-mirrors": ["http://bc437cce.m.daocloud.io"],
    "insecure-registries": ["192.168.31.70"]
}  
EOF

4、启动并开机自启

systemctl start docker
systemctl enable docker

8、部署node组件(node节点)

1、systemd管理kubelet和kube-proxy

cat > /usr/lib/systemd/system/kubelet.service << EOF
[Unit]
Description=Kubernetes Kubelet
After=docker.service
Before=docker.service

[Service]
EnvironmentFile=/opt/kubernetes/cfg/kubelet.conf
ExecStart=/opt/kubernetes/bin/kubelet $KUBELET_OPTS
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF
cat > /usr/lib/systemd/system/kube-proxy.service << EOF
[Unit]
Description=Kubernetes Proxy
After=network.target

[Service]
EnvironmentFile=/opt/kubernetes/cfg/kube-proxy.conf
ExecStart=/opt/kubernetes/bin/kube-proxy $KUBE_PROXY_OPTS
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF

 2、修改配置文件

进入/kubernetes/cfg文件夹

 3、从master节点复制自签证书

3、启动并设置开机启动

systemctl daemon-reload
systemctl start kubelet
systemctl enable kubelet
systemctl start kube-proxy
systemctl enable kube-proxy

 4、批准kubelet证书申请加入集群(master节点操作)

#查看kubelet证书请求
kubectl get csr

#批准申请
kubectl certificate qpprove 申请证书名称

#查看节点
kubectl get node

注:由于网络插件还没有部署,节点会没有准备就绪NotReady

 9、部署CNI网络

先准备好CNI二进制文件:
下载地址:https://github.com/containernetworking/plugins/releases/download/v0.8.6/cni-plugins-linux-amd64-v0.8.6.tgz
解压二进制包并移动到默认工作目录:

mkdir /opt/cni/bin /etc/cin/net.d -p
tar -zxvf cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni/bin/

 下载yml文件

wget https://raw.githubusercontent.com/coreos/flanne1/master/Documentation/kube-flannel.yml

默认镜像地址无法访问,sed命令修改为docker hub镜像仓库。

kubectl apply -f https//raw.githubusercontent.com/coreos/flannel/master/Docmentation/kube-flannel.yml
kubectl get pods -n kube-system

10、测试kubernetes集群

在Kubernetes集群中创建一个pod,验证是否正常运行:

$ kubectl create deployment nginx --image=nginx
$ kubectl expose deployment nginx --port=80 --type=NodePort
$ kubectl get pod,svc

访问地址:http://NodelP:Port
 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐