K8S 学习笔记 | Kubernetes Node 节点安装
技术
作者:宋净超
译者:
2017-08-01 14:20

宋净超(Jimmy Song),TalkingData 容器技术负责人,微服务和云原生应用布道者。2017 年初开始研究 Kubernetes,至目前已发表近 40 篇 Kubernetes 学习笔记。同时,他也是「K8sMeetup 中国社区」的活跃者,见证了「K8sMeetup 中国社区」的一路成长。
经 Jimmy Song 本人授权, K8sMeetup 中国将持续转载他的 Kubernetes 学习笔记,由浅入深地分享他在学习过程中的收获。

前言
这是和我一步步部署 Kubernetes 集群项目(fork 自https://github.com/opsnull/follow-me-install-kubernetes-cluster),下文是结合我之前部署Kubernetes 的过程产生的 Kuberentes 环境,部署 node 节点上的 kube-proxy 和 kubelet,同时对之前部署的 flannel 改造。写作本文时 Kubernetes 最新版本为1.6.0。

安装环境配置信息

  • CentOS7.2.1511
  • Docker 1.12.5
  • Flannel 0.7
  • Kubernetes 1.6.0

部署 Kubernetes Node 节点
Kubernetes node 节点包含如下组件:

  • Flanneld:参考我之前写的文章《Kubernetes 基于 Flannel 的网络配置》(http://rootsongjc.github.io/blogs/kubernetes-network-config/),之前没有配置 TLS,现在需要在 serivce 配置文件中增加 TLS 配置。
  • Docker1.12.5:docker 的安装很简单,这里也不说了。
  • kubelet
  • kube-proxy

下面着重讲 kubelet 和 kube-proxy 的安装,同时还要将之前安装的 flannel 集成 TLS 验证。

目录和文件
我们再检查一下三个节点上,经过前几步操作生成的配置文件。

配置 Flanneld
参考我之前写的文章《Kubernetes 基于 Flannel 的网络配置》(http://rootsongjc.github.io/blogs/kubernetes-network-config/), 之前没有配置 TLS,现在需要在 serivce 配置文件中增加 TLS 配置。

service 配置文件 /usr/lib/systemd/system/flanneld.service。

/etc/sysconfig/flanneld 配置文件。


在 FLANNEL_OPTIONS 中增加 TLS 的配置。

安装和配置 Kubelet
kubelet 启动时向 kube-apiserver 发送 TLS bootstrapping 请求,需要先将 bootstrap token 文件中的 kubelet-bootstrap 用户赋予 system:node-bootstrapper cluster 角色(role), 然后 kubelet 才能有权限创建认证请求(certificate signing requests):

  • --user=kubelet-bootstrap 是在 /etc/kubernetes/token.csv 文件中指定的用户名,同时也写入了 /etc/kubernetes/bootstrap.kubeconfig 文件;

下载最新Kubelet和Kube-Proxy二进制文件

创建 Kubelet 的 Service 配置文件

文件位置 /usr/lib/systemd/system/kubelet.serivce。

kubelet 的配置文件 /etc/kubernetes/kubelet。其中的 IP 地址更改为你的每台 node 节点的 IP 地址。

  • --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.crt 和 kubelet-client.key),然后写入 --kubeconfig 文件;
  • 建议在 --kubeconfig 配置文件中指定 kube-apiserver 地址,如果未指定 --api-servers 选项,则必须指定 --require-kubeconfig 选项后才从配置文件中读取 kube-apiserver 的地址,否则 kubelet 启动后将找不到 kube-apiserver (日志中提示未找到 API Server),kubectl get nodes 不会返回对应的 Node 信息;
  • --cluster_dns 指定 kubedns 的 Service IP (可以先分配,后续创建 kubedns 服务时指定该 IP),--cluster_domain 指定域名后缀,这两个参数同时指定后才会生效。

启动 Kublet

通过 Kublet 的 TLS 证书请求

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


查看未授权的 CSR 请求

通过CSR请求

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

配置 Kube-Proxy
创建 kube-proxy 的服务配置文件
文件路径 /usr/lib/systemd/system/kube-proxy.service。

KUBE-proxy 配置文件 /etc/kubernetes/proxy。

  • --hostname-override 参数值必须与 kubelet 的值一致,否则 kube-proxy 启动后会找不到该节点,从而不会创建任何iptables规则;
  • kube-proxy 根据 --cluster-cidr 判断集群内部和外部流量,指定 --cluster-cidr 或 --masquerade-all 选项后 kube-proxy 才会对访问服务 IP 的请求做 SNAT;
  • --kubeconfig 指定的配置文件嵌入了 kube-apiserver 的地址,用户名,证书,秘钥等请求和认证信息;
  • 预定义的 RoleBinding cluster-admin 将用户 system:kube-proxy 与角色 system:node-proxier 绑定,该 Role 授予了调用 kube-apiserverProxy 相关 API 的权限;

启动 Kube 代理

验证测试
我们创建一个 niginx 的 service 试一下集群是否可用。

访问 172.20.0.113:32724 或 172.20.0.114:32724 或者 172.20.0.115:32724 都可以得到的 nginx 的页面。


751 comCount 0