Kubernetes集中部署Node节点
Kubernetes集中的Node节点部署
kubernetes的Node节点包含如下组件:
flanneld
docker
kubelet
kube-proxy
环境变量
需要的变量。
$ # 替换为 kubernetes master 集任⼀机器 IP
$ export MASTER_IP=10.50.101.41
$ export KUBE_APISERVER="${MASTER_IP}:6443"
$ # 当前部署的节点 IP
$ export NODE_IP=10.50.101.41
$ # 导⼊⽤到的其它全局变量:ETCD_ENDPOINTS、FLANNEL_ETCD_PREFIX、CLUSTER_CIDR、CLUSTER_DNS_SVC_IP、CLUSTER_DNS_DOMAIN、$ source /root/local/bin/environment.sh
$
安装和配置 flanneld
参考
安装和配置docker
下载最新的docker⼆进制⽂件
$ wget get.docker/builds/Linux/x86_64/docker-17.
$ tar -xvf docker-17.
$ cp docker/docker* /usr/local/bin
$ cp docker/completion/bash/docker /etc/bash_completion.d/
$
系统启动加载脚本
创建 docker 的 systemd unit ⽂件
$ cat docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=docs.docker.io
[Service]
Environment="PATH=/usr/local/bin:/bin:/sbin:/usr/bin:/usr/sbin"
EnvironmentFile=-/run/flannel/docker
ExecStart=/root/local/bin/dockerd --log-level=error $DOCKER_NETWORK_OPTIONS
ExecReload=/bin/kill -s HUP $MAINPID
Restart=on-failure
RestartSec=5
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
dockerd 运⾏时会调⽤其它 docker 命令,如 docker-proxy,所以需要将 docker 命令所在的⽬录加到 PATH 环境变量中;
flanneld 启动时将⽹络配置写⼊到 /run/flannel/docker ⽂件中的变量 DOCKER_NETWORK_OPTIONS,dockerd 命令⾏上指定该变量值来设置 docker0 ⽹桥参数;
如果指定了多个 EnvironmentFile 选项,则必须将 /run/flannel/docker 放在最后(确保 docker0 使⽤ flanneld ⽣成的 bip 参数);
不能关闭默认开启的 --iptables 和 --ip-masq 选项;
如果内核版本⽐较新,建议使⽤ overlay 存储驱动;
docker 从 1.13 版本开始,可能将 iptables FORWARD chain的默认策略设置为DROP,从⽽导致 ping 其它 Node 上的 Pod IP 失败,遇到这种情况时,需要⼿动设置策略为 ACCEPT:
$ sudo iptables -P FORWARD ACCEPT
$
并且把以下命令写⼊/etc/rc.local⽂件中,防⽌节点重启iptables FORWARD chain的默认策略⼜还原为DROP
sleep 60 && /sbin/iptables -P FORWARD ACCEPT
为了加快 pull image 的速度,可以使⽤国内的仓库镜像服务器,同时增加下载的并发数。(如果 dockerd 已经运⾏,则需要重启dockerd ⽣效。)
$ cat /etc/docker/daemon.json
{
"registry-mirrors": ["docker.mirrors.ustc.edu", "163"],
"max-concurrent-downloads": 10
}
启动操作
$ sudo cp docker.service /etc/systemd/system/docker.service
$ sudo systemctl daemon-reload
$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalld
$ sudo iptables -F && sudo iptables -X && sudo iptables -F -t nat && sudo iptables -X -t nat
$ sudo systemctl enable docker
$ sudo systemctl start docker
$
需要关闭 firewalld(centos7)/ufw(ubuntu16.04),否则可能会重复创建的 iptables 规则;
最好清理旧的 iptables rules 和 chains 规则;
检查 docker 服务
$ docker version
$
假如上⾯命令报错,请将docker的使⽤⽤户添加到docker⽤户组中,并将${USER}管理权限。
安装和配置kubelet
kubelet 启动时向 kube-apiserver 发送 TLS bootstrapping 请求,需要先将 bootstrap token ⽂件中的 kubelet-bootstrap ⽤户赋予system:node-bootstrapper ⾓⾊,然后 kubelet 才有权限创建认证请求(certificatesigningrequests):
$ kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
$
--user=kubelet-bootstrap 是⽂件 /etc/kubernetes/token.csv 中指定的⽤户名,同时也写⼊了⽂件 /etc/kubernetes/bootstrap.kubeconfig;下载kubelet和 kube-proxy
$ wget dl.k8s.io/v1.6.2/
$ tar -xzvf
$ cd kubernetes
$ tar -xzvf 
$ sudo cp -r ./server/bin/{kube-proxy,kubelet} /root/local/bin/
$
创建 kubelet bootstrapping kubeconfig ⽂件
$ # 设置集参数
$ kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/ssl/ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
-
-kubeconfig=bootstrap.kubeconfig
$ # 设置客户端认证参数
$ kubectl config set-credentials kubelet-bootstrap \
--token=${BOOTSTRAP_TOKEN} \
--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/
--embed-certs 为 true 时表⽰将 certificate-authority 证书写⼊到⽣成的 bootstrap.kubeconfig ⽂件中;
设置 kubelet 客户端认证参数时没有指定秘钥和证书,后续由 kube-apiserver ⾃动⽣成;
kubelet系统启动脚本
创建 kubelet的systemd unit ⽂件
$ sudo mkdir /var/lib/kubelet # 必须先创建⼯作⽬录
$ cat > kubelet.service <<EOF
[Unit]
Description=Kubernetes Kubelet
Documentation=github/GoogleCloudPlatform/kubernetes
After=docker.service
Requires=docker.service
[Service]
WorkingDirectory=/var/lib/kubelet
ExecStart=/usr/local/bin/kubelet \\
--address=${NODE_IP} \\
--hostname-override=${NODE_IP} \\
--pod-infra-container-image=dhat/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=${CLUSTER_DNS_SVC_IP} \\
--cluster-domain=${CLUSTER_DNS_DOMAIN} \\
--hairpin-mode promiscuous-bridge \\
--allow-privileged=true \\
--serialize-image-pulls=false \\
--logtostderr=true \\
--v=2
ExecStartPost=/sbin/iptables -A INPUT -s10.0.0.0/8 -p tcp --dport 4194 -j ACCEPT
ExecStartPost=/sbin/iptables -A INPUT -s172.16.0.0/12 -p tcp --dport 4194 -j ACCEPT
ExecStartPost=/sbin/iptables -A INPUT -s192.168.0.0/16 -p tcp --dport 4194 -j ACCEPT
ExecStartPost=/sbin/iptables -A INPUT -p tcp --dport 4194 -j DROP
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
--address 不能设置为 127.0.0.1,否则后续 Pods 访问 kubelet 的 API 接⼝时会失败,因为 Pods 访问的 127.0.0.1 指向⾃⼰⽽不是kubelet;
如果设置了 --hostname-override 选项,则 kube-proxy 也需要设置该选项,否则会出现不到 Node 的情况;
--experimental-bootstrap-kubeconfig 指向 bootstrap kubeconfig ⽂件,kubelet 使⽤该⽂件中的⽤户名和 token 向 kube-apiserver 发送 TLS Bootstrapping 请求;
管理员通过了 CSR 请求后,kubelet ⾃动在 --cert-dir ⽬录创建证书和私钥⽂件( 和 kubelet-client.key),然后写⼊ --kubeconfig ⽂件(⾃动创建 --kubeconfig 指定的⽂件);
建议在 --kubeconfig 配置⽂件中指定 kube-apiserver 地址,如果未指定 --api-servers 选项,则必须指定 --require-kubeconfig 选项后才从配置⽂件中读取 kue-apiserver 的地址,否则 kubelet 启动后将不到 kube-apiserver (⽇志中提⽰未到 API
Server),kubectl get nodes 不会返回对应的 Node 信息;
--cluster-dns 指定 kubedns 的 Service IP(可以先分配,后续创建 kubedns 服务时指定该 IP),--cluster-domain 指定域名后缀,这两个参数同时指定后才会⽣效;
kubelet cAdvisor 默认在所有接⼝监听 4194 端⼝的请求,对于有外⽹的机器来说不安全,ExecStartPost 选项指定的 iptables 规则只允许内⽹机器访问 4194 端⼝;
启动kubelet
$ sudo cp kubelet.service /etc/systemd/system/kubelet.service
$ sudo systemctl daemon-reload
$ sudo systemctl enable kubelet
$ sudo systemctl start kubelet
$ systemctl status kubelet
$
bootstrap dns 服务器
通过 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  702:07 /etc/kubernetes/kubelet.kubeconfig
$ ls -l /etc/kubernetes/ssl/kubelet*
-rw-r--r-- 1 root root 1046 Apr  702:07 /etc/kubernetes/
-
rw------- 1 root root  227 Apr  702:04 /etc/kubernetes/ssl/kubelet-client.key
-rw-r--r-- 1 root root 1103 Apr  702:07 /etc/kubernetes/
-rw------- 1 root root 1675 Apr  702:07 /etc/kubernetes/ssl/kubelet.key
配置kube-proxy
创建kube-proxy证书
创建kube-proxy证书签名请求:
$ cat 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"
}
]
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。