K8S Mater节点部署
-
1、部署Kubernetes API服务部署
-
apiserver提供集群管理的REST API接口,包括认证授权、数据校验以及集群状态变更等。
-
只有API Server才能直接操作etcd;
-
其他模块通过API Server查询或修改数据
-
提供其他模块之间的数据交互和通信枢纽
(1)准备软件包
1[root@linux-node1 ~]# cd /usr/local/src/kubernetes 2[root@linux-node1 kubernetes]# cp server/bin/kube-apiserver /opt/kubernetes/bin/ 3[root@linux-node1 kubernetes]# cp server/bin/kube-controller-manager /opt/kubernetes/bin/ 4[root@linux-node1 kubernetes]# cp server/bin/kube-scheduler /opt/kubernetes/bin/只需要在linux-node1上拷贝
(2)创建生成CSR的 JSON 配置文件
1[root@linux-node1 ~]# cd /usr/local/src/ssl[root@linux-node1 ssl]# vim kubernetes-csr.json 2{ 3 "CN": "kubernetes", 4 "hosts": [ 5 "127.0.0.1", 6 "192.168.56.110", #Master的ip地址 7 "10.1.0.1", 8 "kubernetes", 9 "kubernetes.default", 10 "kubernetes.default.svc", 11 "kubernetes.default.svc.cluster", 12 "kubernetes.default.svc.cluster.local" 13 ], 14 "key": { 15 "algo": "rsa", 16 "size": 2048 17 }, 18 "names": [ 19 { 20 "C": "CN", 21 "ST": "BeiJing", 22 "L": "BeiJing", 23 "O": "k8s", 24 "OU": "System" 25 } 26 ] 27}
(3)生成 kubernetes 证书和私钥
1[root@linux-node1 ssl]# cfssl gencert -ca=/opt/kubernetes/ssl/ca.pem \ 2 -ca-key=/opt/kubernetes/ssl/ca-key.pem \ 3 -config=/opt/kubernetes/ssl/ca-config.json \ 4 -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes 5[root@linux-node1 ssl]# cp kubernetes*.pem /opt/kubernetes/ssl/ 6[root@linux-node1 ssl]# scp kubernetes*.pem 192.168.56.120:/opt/kubernetes/ssl/ 7[root@linux-node1 ssl]# scp kubernetes*.pem 192.168.56.130:/opt/kubernetes/ssl/
(4) 创建 kube-apiserver 使用的客户端 token 文件
1[root@linux-node1 ~]# head -c 16 /dev/urandom | od -An -t x | tr -d ' ' 2ad6d5bb607a186796d8861557df0d17f 3[root@linux-node1 ~]# vim /opt/kubernetes/ssl/bootstrap-token.csv 4ad6d5bb607a186796d8861557df0d17f,kubelet-bootstrap,10001,"system:kubelet-bootstrap"
(5) 创建基础用户名/密码认证配置
1[root@linux-node1 ~]# vim /opt/kubernetes/ssl/basic-auth.csv 2admin,admin,1 3readonly,readonly,2
(6) 部署Kubernetes API Server
1[root@linux-node1 ~]# vim /usr/lib/systemd/system/kube-apiserver.service 2[Unit] 3Description=Kubernetes API Server 4Documentation=https://github.com/GoogleCloudPlatform/kubernetes 5After=network.target 6 7[Service] 8ExecStart=/opt/kubernetes/bin/kube-apiserver \ 9 --admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota,NodeRestriction \ 10 --bind-address=192.168.56.110 \ 11 --insecure-bind-address=127.0.0.1 \ 12 --authorization-mode=Node,RBAC \ 13 --runtime-config=rbac.authorization.k8s.io/v1 \ 14 --kubelet-https=true \ 15 --anonymous-auth=false \ 16 --basic-auth-file=/opt/kubernetes/ssl/basic-auth.csv \ 17 --enable-bootstrap-token-auth \ 18 --token-auth-file=/opt/kubernetes/ssl/bootstrap-token.csv \ 19 --service-cluster-ip-range=10.1.0.0/16 \ 20 --service-node-port-range=20000-40000 \ 21 --tls-cert-file=/opt/kubernetes/ssl/kubernetes.pem \ 22 --tls-private-key-file=/opt/kubernetes/ssl/kubernetes-key.pem \ 23 --client-ca-file=/opt/kubernetes/ssl/ca.pem \ 24 --service-account-key-file=/opt/kubernetes/ssl/ca-key.pem \ 25 --etcd-cafile=/opt/kubernetes/ssl/ca.pem \ 26 --etcd-certfile=/opt/kubernetes/ssl/kubernetes.pem \ 27 --etcd-keyfile=/opt/kubernetes/ssl/kubernetes-key.pem \ 28 --etcd-servers=https://192.168.56.110:2379,https://192.168.56.120:2379,https://192.168.56.130:2379 \ 29 --enable-swagger-ui=true \ 30 --allow-privileged=true \ 31 --audit-log-maxage=30 \ 32 --audit-log-maxbackup=3 \ 33 --audit-log-maxsize=100 \ 34 --audit-log-path=/opt/kubernetes/log/api-audit.log \ 35 --event-ttl=1h \ 36 --v=2 \ 37 --logtostderr=false \ 38 --log-dir=/opt/kubernetes/log 39Restart=on-failure 40RestartSec=5 41Type=notify 42LimitNOFILE=65536 43 44[Install] 45WantedBy=multi-user.target
(7) 启动API Server服务
1[root@linux-node1 ~]# systemctl daemon-reload 2[root@linux-node1 ~]# systemctl enable kube-apiserver 3[root@linux-node1 ~]# systemctl start kube-apiserver 4[root@linux-node1 ~]# systemctl status kube-apiserver 5[root@linux-node1 ssl]# netstat -tulnp |grep kube-apiserver 6tcp 0 0 192.168.56.110:6443 0.0.0.0:* LISTEN 5052/kube-apiserver 7tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 5052/kube-apiserver
从监听端口可以看到api-server监听在6443端口,同时也监听了本地的8080端口,是提供kube-schduler和kube-controller使用。
-
2、部署Controller Manager服务
-
controller-manager由一系列的控制器组成,它通过apiserver监控整个集群的状态,并确保集群处于预期的工作状态。
(1)部署Controller Manager服务
1[root@linux-node1 ~]# vim /usr/lib/systemd/system/kube-controller-manager.service 2[Unit] 3Description=Kubernetes Controller Manager 4Documentation=https://github.com/GoogleCloudPlatform/kubernetes 5 6[Service] 7ExecStart=/opt/kubernetes/bin/kube-controller-manager \ 8 --address=127.0.0.1 \ 9 --master=http://127.0.0.1:8080 \ 10 --allocate-node-cidrs=true \ 11 --service-cluster-ip-range=10.1.0.0/16 \ 12 --cluster-cidr=10.2.0.0/16 \ 13 --cluster-name=kubernetes \ 14 --cluster-signing-cert-file=/opt/kubernetes/ssl/ca.pem \ 15 --cluster-signing-key-file=/opt/kubernetes/ssl/ca-key.pem \ 16 --service-account-private-key-file=/opt/kubernetes/ssl/ca-key.pem \ 17 --root-ca-file=/opt/kubernetes/ssl/ca.pem \ 18 --leader-elect=true \ 19 --v=2 \ 20 --logtostderr=false \ 21 --log-dir=/opt/kubernetes/log 22 23Restart=on-failure 24RestartSec=5 25 26[Install] 27WantedBy=multi-user.target
(2)启动Controller Manager
1[root@linux-node1 ~]# systemctl daemon-reload 2[root@linux-node1 scripts]# systemctl enable kube-controller-manager 3[root@linux-node1 scripts]# systemctl start kube-controller-manager 4[root@linux-node1 scripts]# systemctl status kube-controller-manager 5[root@linux-node1 ssl]# netstat -tulnp |grep kube-controlle 6tcp 0 0 127.0.0.1:10252 0.0.0.0:* LISTEN 5112/kube-controlle
从监听端口上,可以看到kube-controller监听在本地的10252端口,外部是无法直接访问kube-controller,需要通过api-server才能进行访问。
-
3、部署Kubernetes Scheduler
-
scheduler负责分配调度Pod到集群内的node节点
-
监听kube-apiserver,查询还未分配的Node的Pod
-
根据调度策略为这些Pod分配节点
[root@linux-node1 ~]# vim /usr/lib/systemd/system/kube-scheduler.service [Unit] Description=Kubernetes Scheduler Documentation=https://github.com/GoogleCloudPlatform/kubernetes
[Service] ExecStart=/opt/kubernetes/bin/kube-scheduler
--address=127.0.0.1
--master=http://127.0.0.1:8080
--leader-elect=true
--v=2
--logtostderr=false
--log-dir=/opt/kubernetes/logRestart=on-failure RestartSec=5
[Install] WantedBy=multi-user.target [root@linux-node1 ~]# systemctl daemon-reload [root@linux-node1 scripts]# systemctl enable kube-scheduler [root@linux-node1 scripts]# systemctl start kube-scheduler [root@linux-node1 scripts]# systemctl status kube-scheduler [root@linux-node1 ssl]# netstat -tulnp |grep kube-scheduler tcp 0 0 127.0.0.1:10251 0.0.0.0:* LISTEN 5172/kube-scheduler
从kube-scheduler的监听端口上,同样可以看到监听在本地的10251端口上,外部无法直接访问,同样是需要通过api-server进行访问。
-
4、部署kubectl 命令行工具
kubectl用于日常直接管理K8S集群,那么kubectl要进行管理k8s,就需要和k8s的组件进行通信,也就需要用到证书。此时kubectl需要单独部署,也是因为kubectl也是需要用到证书,而前面的kube-apiserver、kube-controller、kube-scheduler都是不需要用到证书,可以直接通过服务进行启动。
(1)准备二进制命令包
1[root@linux-node1 ~]# cd /usr/local/src/kubernetes/client/bin 2[root@linux-node1 bin]# cp kubectl /opt/kubernetes/bin/
(2)创建 admin 证书签名请求
1[root@linux-node1 ~]# cd /usr/local/src/ssl/ 2[root@linux-node1 ssl]# vim admin-csr.json 3{ 4 "CN": "admin", 5 "hosts": [], 6 "key": { 7 "algo": "rsa", 8 "size": 2048 9 }, 10 "names": [ 11 { 12 "C": "CN", 13 "ST": "BeiJing", 14 "L": "BeiJing", 15 "O": "system:masters", 16 "OU": "System" 17 } 18 ] 19}
(3)生成 admin 证书和私钥
1[root@linux-node1 ssl]# cfssl gencert -ca=/opt/kubernetes/ssl/ca.pem \ 2 -ca-key=/opt/kubernetes/ssl/ca-key.pem \ 3 -config=/opt/kubernetes/ssl/ca-config.json \ 4 -profile=kubernetes admin-csr.json | cfssljson -bare admin 5[root@linux-node1 ssl]# ls -l admin* 6-rw-r--r-- 1 root root 1009 Mar 5 12:29 admin.csr 7-rw-r--r-- 1 root root 229 Mar 5 12:28 admin-csr.json 8-rw------- 1 root root 1675 Mar 5 12:29 admin-key.pem 9-rw-r--r-- 1 root root 1399 Mar 5 12:29 admin.pem 10 11[root@linux-node1 ssl]# cp admin*.pem /opt/kubernetes/ssl/
(4)设置集群参数
1[root@linux-node1 ssl]# kubectl config set-cluster kubernetes \ 2 --certificate-authority=/opt/kubernetes/ssl/ca.pem \ 3 --embed-certs=true \ 4 --server=https://192.168.56.110:6443 5Cluster "kubernetes" set.
(5)设置客户端认证参数
1[root@linux-node1 ssl]# kubectl config set-credentials admin \ 2 --client-certificate=/opt/kubernetes/ssl/admin.pem \ 3 --embed-certs=true \ 4 --client-key=/opt/kubernetes/ssl/admin-key.pem 5User "admin" set.
(6)设置上下文参数
1[root@linux-node1 ssl]# kubectl config set-context kubernetes \ 2 --cluster=kubernetes \ 3 --user=admin 4Context "kubernetes" created.
(7)设置默认上下文
1[root@linux-node1 src]# kubectl config use-context kubernetes 2Switched to context "kubernetes".
上面(4)-->(7)的配置是为了在家目录下生成config文件,之后kubectl和api通信就需要用到该文件,这也就是说如果在其他节点上需要用到这个kubectl,就需要将该文件拷贝到其他节点。
1[root@linux-node1 ~]# cat .kube/config 2apiVersion: v1 3clusters: 4- cluster: 5 certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR2akNDQXFhZ0F3SUJBZ0lVUUszc2dUb0lrNlhmVDhFaUVvcXNNc2pQQUVzd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1pURUxNQWtHQTFVRUJo 6......
(8)使用kubectl工具
1[root@linux-node1 ssl]# kubectl get cs 2NAME STATUS MESSAGE ERROR 3scheduler Healthy ok 4controller-manager Healthy ok 5etcd-2 Healthy {"health": "true"} 6etcd-0 Healthy {"health": "true"} 7etcd-1 Healthy {"health": "true"}