部署kubernetes node节点

kubernetes node 节点包含如下组件:

  • Flanneld: 省略,参照之前部署的文档
  • Docker1.12.5: 省略,参照之前部署的文档
  • kubelet
  • kube-proxy

目录和文件

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

  1. # #master节点:
  2. # ls /etc/kubernetes/ssl
  3. admin-key.pem admin.pem ca-key.pem ca.pem kube-proxy-key.pem kube-proxy.pem kubernetes-key.pem kubernetes.pem
  4. # ls /etc/kubernetes/
  5. apiserver bootstrap.kubeconfig config controller-manager kubelet.kubeconfig kube-proxy.kubeconfig scheduler ssl token.csv
  6. # #node节点:
  7. # ls /etc/kubernetes/ssl
  8. admin-key.pem admin.pem ca-key.pem ca.pem kube-proxy-key.pem kube-proxy.pem kubernetes-key.pem kubernetes.pem
  9. # ls /etc/kubernetes/
  10. bootstrap.kubeconfig config kubelet.kubeconfig kube-proxy.kubeconfig ssl token.csv

下载最新的 kubelet 和 kube-proxy 二进制文件

  1. # wget https://dl.k8s.io/v1.6.0/kubernetes-server-linux-amd64.tar.gz #可忽略,因之前已下载过
  2. # tar -xzvf kubernetes-server-linux-amd64.tar.gz
  3. # cd kubernetes
  4. # cp -r ./server/bin/{kube-proxy,kubelet,kubectl,kubefed} /usr/bin/

安装和配置 kubelet

kubelet 启动时向 kube-apiserver 发送 TLS bootstrapping 请求,需要先将 bootstrap token 文件中的 kubelet-bootstrap 用户赋予 system:node-bootstrapper cluster 角色(role),

然后 kubelet 才能有权限创建认证请求(certificate signing requests):

  1. $ cd /etc/kubernetes
  2. $ kubectl create clusterrolebinding kubelet-bootstrap \
  3. --clusterrole=system:node-bootstrapper \
  4. --user=kubelet-bootstrap
  5. clusterrolebinding "kubelet-bootstrap" created
  • --user=kubelet-bootstrap 是在 /etc/kubernetes/token.csv 文件中指定的用户名,同时也写入了 /etc/kubernetes/bootstrap.kubeconfig 文件;
  • 只需要在其中一台node节点上执行即可

创建 kubelet 的service配置文件

文件位置/etc/systemd/system/kubelet.serivce

  1. [Unit]
  2. Description=Kubernetes Kubelet Server
  3. Documentation=https://github.com/GoogleCloudPlatform/kubernetes
  4. After=docker.service
  5. Requires=docker.service
  6. [Service]
  7. WorkingDirectory=/var/lib/kubelet
  8. EnvironmentFile=-/etc/kubernetes/config
  9. EnvironmentFile=-/etc/kubernetes/kubelet
  10. ExecStart=/usr/bin/kubelet \
  11. $KUBE_LOGTOSTDERR \
  12. $KUBE_LOG_LEVEL \
  13. $KUBELET_API_SERVER \
  14. $KUBELET_ADDRESS \
  15. $KUBELET_PORT \
  16. $KUBELET_HOSTNAME \
  17. $KUBE_ALLOW_PRIV \
  18. $KUBELET_POD_INFRA_CONTAINER \
  19. $KUBELET_ARGS
  20. Restart=on-failure
  21. [Install]
  22. WantedBy=multi-user.target

完整 unit 见 kubelet.service

  • 注意:需要先创建/var/lib/kubelet目录,不然稍后启动kubelet会报如下错误:
  1. Failed at step CHDIR spawning /usr/bin/kubelet: No such file or directory

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

  1. ###
  2. ## kubernetes kubelet (minion) config
  3. #
  4. ## The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)
  5. KUBELET_ADDRESS="--address=192.168.1.29"
  6. #
  7. ## The port for the info server to serve on
  8. #KUBELET_PORT="--port=10250"
  9. #
  10. ## You may leave this blank to use the actual hostname
  11. KUBELET_HOSTNAME="--hostname-override=192.168.1.29"
  12. #
  13. ## location of the api-server
  14. KUBELET_API_SERVER="--api-servers=http://192.168.1.19:8080"
  15. #
  16. ## pod infrastructure container
  17. KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
  18. #
  19. ## Add your own!
  20. KUBELET_ARGS="--cgroup-driver=systemd --cluster-dns=10.254.0.2 --experimental-bootstrap-kubeconfig=/etc/kubernetes/bootstrap.kubeconfig --kubeconfig=/etc/kubernetes/kubelet.kubeconfig --require-kubeconfig --cert-dir=/etc/kubernetes/ssl --cluster-domain=cluster.local. --hairpin-mode promiscuous-bridge --serialize-image-pulls=false"
  • --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.crtkubelet-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 指定域名后缀,这两个参数同时指定后才会生效;

完整配置 见 kubelet

启动kublet

  1. # systemctl daemon-reload
  2. # systemctl enable kubelet
  3. 3 systemctl start kubelet
  4. # systemctl status kubelet
  5. kubelet.service - Kubernetes Kubelet Server
  6. Loaded: loaded (/etc/systemd/system/kubelet.service; disabled; vendor preset: disabled)
  7. Active: active (running) since Tue 2017-07-25 13:11:37 CST; 2s ago
  8. Docs: https://github.com/GoogleCloudPlatform/kubernetes
  9. Main PID: 22236 (kubelet)
  10. CGroup: /system.slice/kubelet.service
  11. ├─22236 /usr/bin/kubelet --logtostderr=true --v=0 --api-servers=http://192.168.1.121:8080 --address=192.168.1.122 --host...
  12. └─22259 journalctl -k -f
  13. ...

通过 kublet 的 TLS 证书请求

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

  • 注意:如果kubelet是使用的master节点上生成的那个token.csv来请求认证的,master就会自动通过认证请求直接加入集群,就不需要手动来通过csr请求

手动查看csr请求

在master上查看未授权的 CSR 请求

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

手动通过 CSR 请求

  1. $ kubectl certificate approve csr-2b308
  2. certificatesigningrequest "csr-2b308" approved
  3. $ kubectl get nodes
  4. NAME STATUS AGE VERSION
  5. 192.168.1.122 Ready 10m v1.6.2
  6. 192.168.1.123 Ready 13s v1.6.2
  • 注意:我这里使用的token.csv是和master上生成的那个是一致的,所以是自动认证csr请求的

查看自动生成了kubelet的公私钥

  1. # ls -l /etc/kubernetes/ssl/kubelet*
  2. -rw-r--r-- 1 root root 1115 Jul 25 13:22 ssl/kubelet.crt
  3. -rw------- 1 root root 1679 Jul 25 13:22 ssl/kubelet.key

配置 kube-proxy

创建 kube-proxy 的service配置文件

文件路径/etc/systemd/system/kube-proxy.service

  1. [Unit]
  2. Description=Kubernetes Kube-Proxy Server
  3. Documentation=https://github.com/GoogleCloudPlatform/kubernetes
  4. After=network.target
  5. [Service]
  6. EnvironmentFile=-/etc/kubernetes/config
  7. EnvironmentFile=-/etc/kubernetes/proxy
  8. ExecStart=/usr/bin/kube-proxy \
  9. $KUBE_LOGTOSTDERR \
  10. $KUBE_LOG_LEVEL \
  11. $KUBE_MASTER \
  12. $KUBE_PROXY_ARGS
  13. Restart=on-failure
  14. LimitNOFILE=65536
  15. [Install]
  16. WantedBy=multi-user.target

完整 unit 见 kube-proxy.service

  1. ###
  2. # kubernetes proxy config
  3. # default config should be adequate
  4. # Add your own!
  5. KUBE_PROXY_ARGS="--bind-address=192.168.1.122 --hostname-override=192.168.1.122 --kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig --cluster-cidr=10.254.0.0/16"
  • --hostname-override 参数值必须与 kubelet 的值一致,否则 kube-proxy 启动后会找不到该 Node,从而不会创建任何 iptables 规则;
  • kube-proxy 根据 --cluster-cidr 判断集群内部和外部流量,指定 --cluster-cidr--masquerade-all 选项后 kube-proxy 才会对访问 Service IP 的请求做 SNAT;
  • --kubeconfig 指定的配置文件嵌入了 kube-apiserver 的地址、用户名、证书、秘钥等请求和认证信息;
  • 预定义的 RoleBinding cluster-admin 将User system:kube-proxy 与 Role system:node-proxier 绑定,该 Role 授予了调用 kube-apiserver Proxy 相关 API 的权限;

完整 配置 见 proxy

启动 kube-proxy

  1. # systemctl daemon-reload
  2. # systemctl enable kube-proxy
  3. # systemctl start kube-proxy
  4. # systemctl status kube-proxy
  5. kube-proxy.service - Kubernetes Kube-Proxy Server
  6. Loaded: loaded (/etc/systemd/system/kube-proxy.service; disabled; vendor preset: disabled)
  7. Active: active (running) since Tue 2017-07-25 13:38:32 CST; 5s ago
  8. Docs: https://github.com/GoogleCloudPlatform/kubernetes
  9. Main PID: 23097 (kube-proxy)
  10. CGroup: /system.slice/kube-proxy.service
  11. └─23097 /usr/bin/kube-proxy --logtostderr=true --v=0 --master=http://192.168.1.121:8080 --bind-address=192.168.1.122 --..

验证测试

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

  1. # kubectl run nginx --replicas=2 --labels="run=load-balancer-example" --image=index.tenxcloud.com/docker_library/nginx:1.9.0 --port=80
  2. deployment "nginx" created
  3. # #通过日志可以看到pods已经被调度到以下节点
  4. Jul 25 13:40:46 localhost kube-scheduler: I0725 13:40:46.810065 21421 event.go:217] Event(v1.ObjectReference{Kind:"Pod", Namespace:"default", Name:"nginx-4240121780-rhx4g", UID:"ced5ffeb-70fb-11e7-878e-00163e0006d3", APIVersion:"v1", ResourceVersion:"66394", FieldPath:""}): type: 'Normal' reason: 'Scheduled' Successfully assigned nginx-4240121780-rhx4g to 192.168.1.122
  5. Jul 25 13:40:46 localhost kube-scheduler: I0725 13:40:46.810166 21421 event.go:217] Event(v1.ObjectReference{Kind:"Pod", Namespace:"default", Name:"nginx-4240121780-c9tvm", UID:"ced5fc8b-70fb-11e7-878e-00163e0006d3", APIVersion:"v1", ResourceVersion:"66393", FieldPath:""}): type: 'Normal' reason: 'Scheduled' Successfully assigned nginx-4240121780-c9tvm to 192.168.1.123
  6. # #映射服务器端口
  7. # kubectl expose deployment nginx --type=NodePort --name=example-service
  8. service "example-service" exposed
  9. # kubectl describe svc example-service
  10. Name: example-service
  11. Namespace: default
  12. Labels: run=load-balancer-example
  13. Annotations: <none>
  14. Selector: run=load-balancer-example
  15. Type: NodePort
  16. IP: 10.254.242.15
  17. Port: <unset> 80/TCP
  18. NodePort: <unset> 31164/TCP
  19. Endpoints: 172.30.59.2:80,172.30.99.2:80
  20. Session Affinity: None
  21. Events: <none>
  22. # #可以看到在node节点上已经对外开放了31164端口
  23. tcp6 0 0 :::31164 :::* LISTEN 23097/kube-proxy
  24. # # 在node节点上可以访问pod集群ip测试
  25. # curl "10.254.242.15:80"
  26. <!DOCTYPE html>
  27. <html>
  28. <head>
  29. <title>Welcome to nginx!</title>
  30. <style>
  31. body {
  32. width: 35em;
  33. margin: 0 auto;
  34. font-family: Tahoma, Verdana, Arial, sans-serif;
  35. }
  36. </style>
  37. </head>
  38. <body>
  39. <h1>Welcome to nginx!</h1>
  40. <p>If you see this page, the nginx web server is successfully installed and
  41. working. Further configuration is required.</p>
  42. <p>For online documentation and support please refer to
  43. <a href="http://nginx.org/">nginx.org</a>.<br/>
  44. Commercial support is available at
  45. <a href="http://nginx.com/">nginx.com</a>.</p>
  46. <p><em>Thank you for using nginx.</em></p>
  47. </body>
  48. </html>

访问192.168.1.122:31164192.168.1.123:31164都可以得到nginx的页面。

08-部署node节点的更多相关文章

  1. 部署node节点组件

    部署node节点组件 mv kubelet kube-proxy /opt/kubernetes/bin chmod +x /opt/kubernetes/bin/* && chmod ...

  2. kubernetes容器集群管理部署node节点组件

    发送配置文件到各个节点 [root@master ~]# scp /opt/kubernetes/cfg/*kubeconfig root@192.168.238.128:/opt/kubernete ...

  3. 二进制安装 kubernetes 1.12(四) - 部署 Node 节点组件

    在 master 上操作 vi /etc/profile export PATH=/opt/kubernetes/bin:$PATH source /etc/profile 将 kubelet-boo ...

  4. k8s1.13.0二进制部署-node节点(四)

    Master apiserver启用TLS认证后,Node节点kubelet组件想要加入集群,必须使用CA签发的有效证书才能与apiserver通信,当Node节点很多时,签署证书是一件很繁琐的事情, ...

  5. Kubernets二进制安装(12)之部署Node节点服务的kube-Proxy

    kube-proxy是Kubernetes的核心组件,部署在每个Node节点上,它是实现Kubernetes Service的通信与负载均衡机制的重要组件; kube-proxy负责为Pod创建代理服 ...

  6. Kubernets二进制安装(11)之部署Node节点服务的kubelet

    集群规划 主机名 角色 IP地址 mfyxw30.mfyxw.com kubelet 192.168.80.30 mfyxw40.mfyxw.com kubelet 192.168.80.40 注意: ...

  7. k8s二进制部署 - node节点安装

    创建kubelet配置 • set-cluster # 创建需要连接的集群信息,可以创建多个k8s集群信息 [root@hdss7-21 ~]# kubectl config set-cluster ...

  8. Kubernetes容器集群管理环境 - Node节点的移除与加入

    一.如何从Kubernetes集群中移除Node比如从集群中移除k8s-node03这个Node节点,做法如下: 1)先在master节点查看Node情况 [root@k8s-master01 ~]# ...

  9. node节点的部署

    master点赋予用户权限 [root@mast-1 k8s]# kubectl create clusterrolebinding kubelet-bootstrap \ > --cluste ...

  10. suse 12 二进制部署 Kubernetets 1.19.7 - 番外篇 - 增加node节点

    文章目录 0.前景提要 1.准备node节点环境 1.0.修改配置脚本参数 1.1.配置免密 1.2.添加hosts解析 1.3.修改主机名 1.4.更新PATH变量 1.5.安装依赖包 1.6.关闭 ...

随机推荐

  1. 项目(五)jumpserver企业开源跳板机搭建

    跳板机是什么?跳板机是运维堡垒主机的另个称呼.作为技术或者运维人员应该不会陌生.企业为了服务器的安全,通常所有的ssh连接都是通过跳板机来完成,以便于对ssh连接进行验证和管理. 接下来,我来讲述一下 ...

  2. HTML 元素大小

    1.元素的偏移量 元素的可见大小是由其高度.宽度决定,包括所有的内边距.滚动条和边框大小(不包括外边距). offsetHeight :元素在垂直方向上占用的空间大小,以像素计算.包括元素的高度,水平 ...

  3. IP路由配置之---------debugging调试

    实验设备:华三设备N台加一个PC 步骤一,打开屏幕输出开关,开启控制台对系统信息的监视功能 <H3C>terminal debugging #<H3C>terminal mon ...

  4. matplotlib 坑

    1 archlinux里安装好matplotlib之后一定要安装python-cario pacman -S python-cairo

  5. [leetcode]58. Length of Last Word最后一个词的长度

    Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return the l ...

  6. jQuery的介绍

    01-jQuery的介绍   1.为什么要使用jQuery 在用js写代码时,会遇到一些问题: window.onload 事件有事件覆盖的问题,因此只能写一个事件. 代码容错性差. 浏览器兼容性问题 ...

  7. maven插件后报错:org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project

    在给eclipse换了高版本的maven插件后,引入jar包报如下的错误: org.apache.maven.archiver.MavenArchiver.getManifest(org.apache ...

  8. 安装配置python环境,并跑一个推荐系统的例子

    1.官网下载python2.7,安装完后,在环境变量Path中加上这个路径 在控制台输入python,出现版本信息,就成功了. 2.我使用的是 pycharm,注册后,在 把自己的python.exe ...

  9. centos6.9 编译安装 zabbix-3.0.15

    本文采用编译安装,请在zabbix官网下载所需版本.此处安装版本是:zabbix-3.0.15.tar.gz 操作系统:centos 6.9 一.安装mysqlmysql-community-libs ...

  10. IOS xib和代码自定义UIView

    https://www.jianshu.com/p/1bcc29653085 总结的比较好 iOS开发中,我们常常将一块View封装起来,以便于统一管理内部的子控件. 下面就来说说自定义View的封装 ...