二进制k8s简单集群搭建
k8s 二进制部署
一:etcd
二:kube-apiserver
三:kube-scheduler、kube-controller-manager
四:kubelet、kube-proxy
①:基本思路
1:创建虚机、(对系统环境进行修改参数)
关闭swap分区、防火墙关闭、主机名以及/etc/hosts文件
2:生成SSL证书文件
(这个证书文件用于etcd部署时需要)
注意:这里创建证书的时候集群内部通信ip可以多写几个,用于后期扩容使用
3:部署etcd(在每个节点上部署)
4:为APIserver自签证书(master节点)需要将其部分的配置到/usr/lib/systemd/system
①:首先启动apiserver
②:启动controller manager
③:启动scheduler
5:为node节点部署应用
①:docker
②:kubelet
③:kube-proxy
pod创建需要经历如下核心事件,
①:感知pod被创建,并清楚知道pod创建出来需要哪一些具体信息
②:kubelet在获取到这部分数据后,根据这些资源信息操作宿主机来完成资源分配,网络构建以及下载镜像到本地,将pod启动。
kubelet 的工作核心,就是一个控制循环SyncLoop,驱动这个控制循环运行的事件,包括四种:
1.Pod 更新事件
2.Pod 生命周期变化
3.kubelet 本身设置的执行周期
4.定时的清理事件
②:实操部分(master)一:
下面为具体操作中的部分步骤:
本方案因资源不足,仅模拟单master+3node模式,若后续有更多资源可以把高可用集成进来,搭建软负载haproxy+keepalived
虚机IP | 虚机资源 | 虚机角色 |
---|---|---|
master 192.168.40.1 | 3c4g | master(kube-apiserver、kube-controller-manager、kube-scheduler)、node、etcd |
node1 192.168.40.2 | 2c2g | node(kubelet、kube-proxy) |
node2 192.168.40.3 | 2c2g | node(kubelet、kube-proxy) |
这里有cfssl、openssl等方式创建证书,下面采取利用openssl的方式生成证书。
一:openssl生成证书
在当前目录下创建ca证书;
生成私钥文件ca.key
openssl genrsa -out ca.key 2048
根据私钥文件生成根证书文件ca.crt
openssl req -x509 -new -nodes -key ca.key -subj “/CN=192.168.40.1” -days 36500 -out ca.crt
注意:/CN后输入的为master的主机名或IP地址 | days为证书的有效期(单位天)
将文件ca.key和ca.crt保存在/etc/kubernetes/pki目录下;
二:部署安全的etcd高可用集群
(注意:这里集群内的节点统一用CA,openssl认证配置文件)
etcd部署:
etcd.service
(放到Environment位置)/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/local/bin/etcd
Restart=always
[Install]
WantedBy=multi-user.target
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就是装了etcd的节点
IP.1 = 192.168.40.1
IP.2 = 192.168.40.2
IP.3 = 192.168.40.3
接下来创建etcd的服务端证书(并将.key、.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的客户端证书(同理将.key、.crt文件放至/etc/etcd/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
③:etcd参数配置说明
对三个etcd节点进行配置,环境变量放置/etc/etcd/etcd.conf文件中;
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.40.1:2379 #**(对应修改)**
ETCD_ADVERTISE_CLIENT_URLS=https://192.168.40.1: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.40.1:2380 #**(对应修改)**
ETCD_INITIAL_ADVERTISE_PEER_URLS=https://192.168.40.1:2380 #**(对应修改)**
ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
ETCD_INITIAL_CLUSTER="etcd1=https://192.168.40.1:2380,etcd2=https://192.168.40.2:2380,etcd3=https://192.168.40.3:2380"
ETCD_INITIAL_CLUSTER_STATE=new
这里:listen_URL和advertise_URL一起用于给其他节点提供URL地址
PEER(代表相互通信所使用的凭证)
④:kube-apiserver
(这里下载k8s master的相关文件,里面有server、node的二进制包)
1:kube-apiserver所需要的CA证书。
2:通过最开始的openssl生成的ca.crt和ca.key来与apiserver建立认证。
3:为kube-apiserver创建systemd服务配置文件。
/usr/lib/systemd/system/kube-apiserver.service
4:在/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
--service-account-issuer=https://kubernetes.default.svc.cluster.local
--service-account-key-file=/etc/kubernetes/pki/sa.pub
--service-account-signing-key-file=/etc/kubernetes/pki/sa-key.pem
--apiserver-count=3 --endpoint-reconciler-type=master-count
--etcd-servers=https://192.168.40.1:2379,https://192.168.40.2:2379,https://192.168.40.3:2379
--etcd-cafile=/etc/kubernetes/pki/ca.crt
--etcd-certfile=/home/apps/etcd/pki/etcd_client.crt
--etcd-keyfile=/home/apps/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"
5:使用cfssl创建sa.pub和sa-key.pem
cat<<EOF > sa-csr.json
{
"CN":"sa",
"key":{
"algo":"rsa",
"size":2048
},
"names":[
{
"C":"CN",
"L":"BeiJing",
"ST":"BeiJing",
"O":"k8s",
"OU":"System"
}
]
}
EOF
通过cfssl 生成apiserver服务所需的文件
cfssl gencert -initca sa-csr.json | cfssljson -bare sa -
openssl x509 -in sa.pem -pubkey -noout > sa.pub
⑤.创建客户端连接apiserver的所需的kubeconfig配置文件
apiVersion: v1
kind: Config
clusters:
- name: default
cluster:
server: https://192.168.40.1: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:指的是负载均衡的VIP、和haproxy的监听端口号
注解:users中的username和context中的user:连接API server的用户名,设置为与客户端证书中“/CN”名称保持一致,例如“admin”
⑥:创建controller所需的配置文件
首先,创建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
1.1:编辑/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"
⑦:部署kube-scheduler
1:创建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
2:编辑 /etc/kubernetes/scheduler
KUBE_SCHEDULER_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig \
--leader-elect=true \
--logtostderr=false --log-dir=/var/log/kubernetes --v=0"
systemctl daemon-reload
systemctl start kube-scheduler && systemctl enable kube-scheduler
systemctl status kube-scheduler
⑧:部署haproxy去搭载master节点
vim /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/lib/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.40.1:6443 check (这里只有一个master节点)
这里可以利用systemd开启haproxy,或者起容器来启动haproxy,这里尝试利用容器来起服务。
1:编辑docker-compose.yaml
version: "3"
services:
haproxy:
image: "haproxytech/haproxy-debian:2.3"
container_name: k8s-haproxy
network_mode: host
restart: always
volumes:
- /home/apps/haproxy/conf/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
##docker-compose up -d
2:检验haproxy启动服务状态可以进入192.168.40.1:8888访问,用户名和密码在haproxy.cfg文件里;
二:部署node(在每个node节点上执行)
1:kubelet部署
①:首先为node节点添加kubelet服务;
[Unit]
Description=Kubernetes Kubelet Server
Documentation=https://kubernetes.io/docs/
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="--kubeconfig=/etc/kubernetes/kubeconfig \
--config=/etc/kubernetes/kubelet.config \
--hostname-override=192.168.40.1 \
--network-plugin=cni \
--logtostderr=false --log-dir=/var/log/kubernetes --v=0"
###注意这里的hostname-override为node节点自己的IP、
###这里的log-dir(目录可以尝试自己先创建出文件)touch /var/log/kubernetes
③:编辑 /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
###注意,用journalctl -xe 去看日志错误 journalctl -u 服务(可以定向查询),若期间某个服务未起来(报错),比较好的方式若是测试的话,可以开启服务的日志,来直观地找到报错信息;
可以在对应地服务文件.service里面加入-v (标准输出)每个服务地参数不一致,可以–help查询;
2:部署kube-proxy服务
①:编辑 /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
###注意这个文件需要备份到原始目录($HOME/.kube/config)
KUBE_PROXY_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig \
--hostname-override=192.168.40.1 \
--proxy-mode=iptables \
--logtostderr=false --log-dir=/var/log/kubernetes --v=0"
3:最后部署CNI插件即可。
参考:《kubernetes权威指南第5版》
https://www.cnblogs.com/XY-Heruo/p/17034977.html
第一次编辑文章,有疏忽的地方还望指正!继续努力学习!!!
更多推荐
所有评论(0)