6.kubernetes部署Node节点Docker服务

发布时间:2018年06月08日 阅读:657 次

企业级kubernetes的部署

公司要新系统部署k8s应用,需要本地测试环境部署俩套,生产环境云上部署俩套k8s,互备模式,当一个升级更新维护时另一个来替代

部署 Node 节点

kubernetes Node 节点包含如下组件:

安装和配置 docker

下载最新的 docker 二进制文件

https://download.docker.com/linux/static/stable/x86_64/
wget  https://download.docker.com/linux/static/stable/x86_64/docker-17.06.2-ce.tgz 
tar -xvf docker-17.04.0-ce.tgz
cp docker/docker* /opt/kubernetes/


创建 docker 的 systemd unit 文件

vim /etc/systemd/system/docker.service

[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.io

[Service]
Environment="PATH=/opt/kubernetes:/bin:/sbin:/usr/bin:/usr/sbin"
EnvironmentFile=-/run/flannel/docker
ExecStart=/opt/kubernetes/dockerd --log-level=error $DOCKER_NETWORK_OPTIONS 
ExecReload=/bin/kill -s HUP $MAINPID
Restart=on-failure
RestartSec=5
LimitNOFILE=102400
LimitNPROC=infinity
LimitCORE=infinity
Delegate=yes
KillMode=process

[Install]
WantedBy=multi-user.target

为了加快 pull image 的速度,可以使用国内的仓库镜像服务器,同时增加下载的并发数。(如果 dockerd 已经运行,则需要重启 dockerd 生效。)

$ cat /etc/docker/daemon.json
{  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn", "hub-mirror.c.163.com"],  "max-concurrent-downloads": 10
}

启动 dockerd

$ systemctl daemon-reload
$ systemctl enable docker
$ systemctl start docker

检查 docker 服务

$ docker version

安装和配置 kubelet

kubelet 启动时向 kube-apiserver 发送 TLS bootstrapping 请求,需要先将 bootstrap token 文件中的 kubelet-bootstrap 用户赋予 system:node-bootstrapper 角色,然后 kubelet 才有权限创建认证请求(certificatesigningrequests):

创建一个 clusterrolebinding,将 group system:bootstrappers 和 clusterrole system:node-bootstrapper 绑定:
kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --group=system:bootstrappers


kubelet 和 kube-proxy 二进制文件在上面的文章里已经介绍过了

创建 kubelet bootstrapping kubeconfig 文件

$ # 设置集群参数
$ kubectl config set-cluster kubernetes \
  --certificate-authority=/etc/kubernetes/ssl/ca.pem \
  --embed-certs=true \
  --server=https://192.168.10.1:6443 \
  --kubeconfig=bootstrap.kubeconfig
  
 # TLS Bootstrapping 使用的 Token,可以使用命令 head -c 16 /dev/urandom | od -An -t x | tr -d ' ' 生成
41f7e4ba8b7be874fcff18bf5cf41a7c
$ # 设置客户端认证参数
$ kubectl config set-credentials kubelet-bootstrap \
  --token=41f7e4ba8b7be874fcff18bf5cf41a7c \
  --kubeconfig=bootstrap.kubeconfig
  
$ # 设置上下文参数
$ kubectl config set-context default \
  --cluster=kubernetes \
  --user=kubelet-bootstrap \
  --kubeconfig=bootstrap.kubeconfig
  
$ # 设置默认上下文
$ kubectl config use-context default --kubeconfig=bootstrap.kubeconfig
$ mv bootstrap.kubeconfig /etc/kubernetes/

创建 kubelet 的 systemd unit 文件

创建kubelet的工作目录
mkdir  /var/lib/kubelet

vim /etc/systemd/system/kubelet.service


[Unit]
Description=Kubernetes Kubelet
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=docker.service
Requires=docker.service

[Service]
WorkingDirectory=/var/lib/kubelet
ExecStart=/opt/kubernetes/kubelet \
  --address=192.168.10.1 \
  --hostname-override=192.168.10.1 \
  --pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest \
  --experimental-bootstrap-kubeconfig=/etc/kubernetes/bootstrap.kubeconfig \
  --kubeconfig=/etc/kubernetes/kubelet.kubeconfig \
  --require-kubeconfig \
  --cert-dir=/etc/kubernetes/ssl \
  --cluster-dns=10.254.0.2 \
  --cluster-domain=cluster.local. \
  --hairpin-mode promiscuous-bridge \
  --allow-privileged=true \
  --fail-swap-on=false \
  --serialize-image-pulls=false \
  --logtostderr=true \
  --v=2
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

启动 kubelet

$ systemctl daemon-reload
$ systemctl enable kubelet
$ systemctl start kubelet
$ systemctl status kubelet

通过 kubelet 的 TLS 证书请求

kubelet 首次启动时向 kube-apiserver 发送证书签名请求,必须通过后 kubernetes 系统才会将该 Node 加入到集群。

查看未授权的 CSR 请求:

$ kubectl get csr
NAME        AGE       REQUESTOR           CONDITION
csr-2b308   4m        kubelet-bootstrap   Pending
$ kubectl get nodes
No resources found.

通过 CSR 请求:


$ kubectl certificate approve csr-2b308
certificatesigningrequest "csr-2b308" approved
$ kubectl get nodes
NAME        STATUS    AGE       VERSION
10.64.3.7   Ready     49m       v1.6.2

自动生成了 kubelet kubeconfig 文件和公私钥:

$ ls -l /etc/kubernetes/kubelet.kubeconfig
-rw------- 1 root root 2284 Apr  7 02:07 /etc/kubernetes/kubelet.kubeconfig
$ ls -l /etc/kubernetes/ssl/kubelet*-rw-r--r-- 1 root root 1046 Apr  7 02:07 /etc/kubernetes/ssl/kubelet-client.crt
-rw------- 1 root root  227 Apr  7 02:04 /etc/kubernetes/ssl/kubelet-client.key
-rw-r--r-- 1 root root 1103 Apr  7 02:07 /etc/kubernetes/ssl/kubelet.crt
-rw------- 1 root root 1675 Apr  7 02:07 /etc/kubernetes/ssl/kubelet.key

配置 kube-proxy

创建 kube-proxy 证书

创建 kube-proxy 证书签名请求:https://pan.baidu.com/s/1Y5Dq3D-6xJ6B74IHUahkTg

vim kube-proxy-csr.json

{
  "CN": "system:kube-proxy",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}

生成 kube-proxy 客户端证书和私钥:

$ cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem \
  -ca-key=/etc/kubernetes/ssl/ca-key.pem \
  -config=/etc/kubernetes/ssl/ca-config.json \
  -profile=kubernetes  kube-proxy-csr.json | cfssljson -bare kube-proxy
$ ls kube-proxy*kube-proxy.csr  kube-proxy-csr.json  kube-proxy-key.pem  kube-proxy.pem
$ mv kube-proxy*.pem /etc/kubernetes/ssl/

创建 kube-proxy kubeconfig 文件

$ # 设置集群参数
$ kubectl config set-cluster kubernetes \
  --certificate-authority=/etc/kubernetes/ssl/ca.pem \
  --embed-certs=true \
  --server=https://192.168.10.1:6443 \
  --kubeconfig=kube-proxy.kubeconfig
  
$ # 设置客户端认证参数
$ kubectl config set-credentials kube-proxy \
  --client-certificate=/etc/kubernetes/ssl/kube-proxy.pem \
  --client-key=/etc/kubernetes/ssl/kube-proxy-key.pem \
  --embed-certs=true \
  --kubeconfig=kube-proxy.kubeconfig
  
$ # 设置上下文参数
$ kubectl config set-context default \
  --cluster=kubernetes \
  --user=kube-proxy \
  --kubeconfig=kube-proxy.kubeconfig
  
$ # 设置默认上下文
$ kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
$ mv kube-proxy.kubeconfig /etc/kubernetes/

创建 kube-proxy 的 systemd unit 文件

vim /etc/systemd/system/kube-proxy.service

[Unit]
Description=Kubernetes Kube-Proxy Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target

[Service]
WorkingDirectory=/var/lib/kube-proxy
ExecStart=/opt/kubernetes/kube-proxy \
  --bind-address=192.168.10.1 \
  --hostname-override=192.168.10.1 \
  --cluster-cidr=10.254.0.0/16 \
  --kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig \
  --logtostderr=true \
  --v=2
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

启动 kube-proxy

$ systemctl daemon-reload
$ systemctl enable kube-proxy
$ systemctl start kube-proxy
$ systemctl status kube-proxy

去master上看node节点有没有加上来

kubectl  get nodes

要是还没有加上来的话

[root@hp-001 ~]# kubectl  get csr
NAME                                                   AGE       REQUESTOR           CONDITION
node-csr-a0-lkbL5o87k5MBOT8Dxdnyv3WqTsRJg5nS89SG9i78   2m        kubelet-bootstrap   Pending
node-csr-uQb_AUmM54YzAg-ylvXce2oujJqL5QuQFs_qzom_sow   1m        kubelet-bootstrap   Pending

[root@hp-001 ~]# kubectl certificate approve node-csr-a0-lkbL5o87k5MBOT8Dxdnyv3WqTsRJg5nS89SG9i78
certificatesigningrequest "node-csr-a0-lkbL5o87k5MBOT8Dxdnyv3WqTsRJg5nS89SG9i78" approved
[root@hp-001 ~]# kubectl certificate approve node-csr-uQb_AUmM54YzAg-ylvXce2oujJqL5QuQFs_qzom_sow
certificatesigningrequest "node-csr-uQb_AUmM54YzAg-ylvXce2oujJqL5QuQFs_qzom_sow" approved


[root@hp-001 ~]# kubectl  get node
NAME           STATUS    ROLES     AGE       VERSION
192.168.10.1   Ready     <none>    39d       v1.9.1
192.168.10.2   Ready     <none>    39d       v1.9.1
192.168.10.3   Ready     <none>    39d       v1.9.1
192.168.10.4   Ready     <none>    18s       v1.9.1
192.168.10.5   Ready     <none>    11s       v1.9.1


Tag:kubernetes docker container
相关文章

发表评论: