k8s(kubernetes)集群的两种搭建方式(二进制方式)
在开始之前,部署Kubernetes集群机器需要满足以下几个条件:(1)一台或多台机器,操作系统Cent0S7.x-86x64(2)硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB 或更多或更多(3)集群中所有机器之间网络互通(4)可以访问外网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点(5)禁止swap分区。
1、安装要求
在开始之前,部署Kubernetes集群机器需要满足以下几个条件:
(1)一台或多台机器,操作系统Cent0S7.x-86x64
(2)硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB 或更多或更多
(3)集群中所有机器之间网络互通
(4)可以访问外网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点
(5)禁止swap分区
2、准备环境
1、软件环境
软件 | 版本 |
操作系统 | CentOS7.8 x64(mini) |
Docker | 19-ce |
Kubernetes | 1.19 |
2、服务器规划
角色 | IP | 组件 |
k8s-master | 192.168.31.71 | kube-apiserver,kube-controller-manager,kube-scheduler,etcd |
k8s-node1 | 192.168.31.72 | kubelet,kube-proxy,docker,etcd |
k8s-node2 | 192.168.31.73 | kubelet,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-1 | 192.168.31.71 |
etcd-2 | 192.168.31.72 |
etcd-3 | 192.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
更多推荐
所有评论(0)