不容错过的运维书籍推荐

二进制部署kubernetes集群-11.部署node节点kube-proxy

kube-proxy 运行在所有 worker 节点上,,它监听 apiserver 中 service 和 Endpoint 的变化情况,创建路由规则来进行服务负载均衡。

11.1 创建kube-proxy证书

  1. # kube-proxy提取CN作为客户端的用户名,即system:kube-proxy。
  2. # kube-apiserver预定义的 RBAC使用的ClusterRoleBindings system:node-proxier将用户system:kube-proxy与ClusterRole system:node-proxier绑定,该Role授予节点调用kube-apiserver proxy相关api的权限;
  3. # hosts列表为空
  4. cat > kube-proxy-csr.json <<EOF
  5. {
  6. "CN": "system:kube-proxy",
  7. "key": {
  8. "algo": "rsa",
  9. "size": 2048
  10. },
  11. "names": [
  12. {
  13. "C": "CN",
  14. "ST": "Chengdu",
  15. "L": "Chengdu",
  16. "O": "k8s",
  17. "OU": "sysit"
  18. }
  19. ]
  20. }
  21. EOF

11.2 生成证书和私钥

  1. cfssl gencert -ca=/opt/k8s/ca.pem \
  2. -ca-key=/opt/k8s/ca-key.pem \
  3. -config=/opt/k8s/ca-config.json \
  4. -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy

11.3 创建 kubeconfig 文件

  1. # 配置集群参数;
  2. # --server:指定api-server,采用ha之后的vip;
  3. # cluster名自定义,设定之后需保持一致;
  4. # --kubeconfig:指定kubeconfig文件路径与文件名;如果不设置,默认生成在~/.kube/config文件
  5. # --embed-certs=true:将 c

二进制部署kubernetes集群-10.部署node节点docker及kubelet服务

kublet 运行在每个 worker 节点上(生产环境可能需要在master节点上也运行),接收 kube-apiserver 发送的请求,管理 Pod 容器,执行交互式命令,如 exec、run、logs 等。

kublet 启动时自动向 kube-apiserver 注册节点信息,内置的 cadvisor 统计和监控节点的资源使用情况。

为确保安全,本文档只开启接收 https 请求的安全端口,对请求进行认证和授权,拒绝未授权的访问(如 apiserver、heapster)。

10.1 安装docker-ce

  1. wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
  2. # 修改为清华大学源,加快安装速度
  3. sudo sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
  4. yum install docker-ce
  5. # 编辑systemctl的Docker启动文件
  6. # Docker从1.13版本开始调整了默认的防火墙规则,禁用了iptables filter表中FOWARD链,这样会引起Kubernetes集群中跨Node的Pod无法通信,因此docker安装完成后,还需要手动修改iptables规则。
  7. sed -i "13i ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT" /usr/lib/systemd/system/docker.service
  8. # 1.15.x添加如下
  9. mkdir /etc/docker
  10. cat > /etc/docker/daemon.json <<EOF
  11. {
  12. "exec-opts": ["native.cgroupdriver=systemd"],
  13. "log-driver": "json-file",
  14. "log-opts": {
  15. "max-size": "100m"
  16. },

二进制部署kubernetes集群-9.部署master节点的kube-scheduler

该集群包含 3 个节点,启动后将通过竞争选举机制产生一个 leader 节点,其它节点为阻塞状态。当 leader 节点不可用后,剩余节点将再次进行选举产生新的 leader 节点,从而保证服务的可用性。

为保证通信安全,本文档先生成 x509 证书和私钥,kube-scheduler 在如下两种情况下使用该证书:

与 kube-apiserver 的安全端口通信;
在安全端口(https,10251) 输出 prometheus 格式的 metrics;

9.1 安装二进制包

在前面安装kubectl工具的时候,已经安装了所有需要的软件包。

9.2 安装kube-scheduler

9.2.1 创建 kube-scheduler 证书和私钥

  1. # hosts 列表包含所有 kube-scheduler 节点 IP;
  2. # CN 为 system:kube-scheduler、O 为 system:kube-scheduler,kubernetes 内置的 ClusterRoleBindings system:kube-scheduler 将赋予 kube-scheduler 工作所需的权限。
  3. cat > kube-scheduler-csr.json <<EOF
  4. {
  5. "CN": "system:kube-scheduler",
  6. "hosts": [
  7. "127.0.0.1",
  8. "10.28.118.184",
  9. "10.28.117.28",
  10. "10.28.119.227",
  11. "10.28.119.11"
  12. ],
  13. "key": {
  14. "algo": "rsa",
  15. "size": 2048
  16. },
  17. "names": [
  18. {
  19. "C": "CN",
  20. "ST": "Chengdu",
  21. "L": "Chengdu",
  22. "O": "system:kube-scheduler",
  23. "OU": "sysit"
  24. }
  25. ]
  26. }
  27. EOF

9.2.2 生成

二进制部署kubernetes集群-8.部署master节点的kube-controller-manager

该集群包含 3 个节点,启动后将通过竞争选举机制产生一个 leader 节点,其它节点为阻塞状态。当 leader 节点不可用后,剩余节点将再次进行选举产生新的 leader 节点,从而保证服务的可用性。

为保证通信安全,本文档先生成 x509 证书和私钥,kube-controller-manager 在如下两种情况下使用该证书:

与 kube-apiserver 的安全端口通信时;
在安全端口(https,10252) 输出 prometheus 格式的 metrics;

8.1 安装二进制包

在前面安装kubectl工具的时候,已经安装了所有需要的软件包。

8.2 安装kube-controller-manager

8.2.1 创建 kube-controller-manager 证书和私钥

创建证书签名请求:

  1. # kube-controller-mamager与kubei-apiserver通信采用双向TLS认证;
  2. # hosts 列表包含所有 kube-controller-manager 节点 IP;
  3. # CN 为 system:kube-controller-manager、O 为 system:kube-controller-manager,kubernetes 内置的 ClusterRoleBindings system:kube-controller-manager 赋予 kube-controller-manager 工作所需的权限。
  4. cat > kube-controller-manager-csr.json <<EOF
  5. {
  6. "CN": "system:kube-controller-manager",
  7. "key": {
  8. "algo": "rsa",
  9. "size": 2048
  10. },
  11. "hosts": [
  12. "127.0.0.1",
  13. "10.28.118.184",
  14. "10.28.117.28",
  15. "10.28.119.227",
  16. "10.28.119.11"
  17. ],
  18. "names": [

二进制部署kubernetes集群-6.部署master节点的kube-apiserver

kubernetes master 节点运行如下组件:

  • kube-apiserver
  • kube-scheduler
  • kube-controller-manager

kube-schedulerkube-controller-manager 可以以集群模式运行,通过 leader 选举产生一个工作进程,其它进程处于阻塞模式。

对于 kube-apiserver,可以运行多个实例(本文档是 3个节点 实例),但对其它组件需要提供统一的访问地址,该地址需要高可用。本文档使用 keepalivedhaproxy 实现 kube-apiserver VIP 高可用和负载均衡,keepalived+haproxy见前面章节。

7.1 安装二进制包

  1. wget https://dl.k8s.io/v1.20.7/kubernetes-server-linux-amd64.tar.gz
  2. tar -zxvf kubernetes-server-linux-amd64.tar.gz
  3. for node in master1 master2 master3 node1 node2
  4. do
  5. echo ">>> ${node}"
  6. ssh root@${node} "mkdir -p /usr/local/kubernetes"
  7. scp -r kubernetes/server/bin root@${node}:/usr/local/kubernetes/
  8. done

7.2 安装kube-apiserver

7.2.1 创建 kubernetes 证书和私钥

  1. cat > kubernetes-csr.json <<EOF
  2. {
  3. "CN": "kubernetes",
  4. "hosts": [
  5. "127.0.0.1",
  6. "10.28.117.28",
  7. "10.28.119.227",
  8. "10.28.119.11",
  9. "10.28.118.184",
  10. "10.254.0.1",
  11. "kubernetes",
  12. "kubernetes.default",
  13. "kubernete

二进制部署kubernetes集群-5.kubectl工具

kubectl 是 kubernetes 集群的命令行管理工具,本文档介绍安装和配置它的步骤。

kubectl 默认从 ~/.kube/config 文件读取 kube-apiserver 地址、证书、用户名等信息,如果没有配置,执行 kubectl 命令时可能会出错:

5.1 源码安装

  1. wget https://dl.k8s.io/v1.20.7/kubernetes-client-linux-amd64.tar.gz
  2. tar -zxvf kubernetes-client-linux-amd64.tar.gz
  3. for node in master1 master2 master3 node1 node2
  4. do
  5. echo ">>> ${node}"
  6. ssh root@${node} "mkdir -p /usr/local/kubernetes"
  7. scp -r kubernetes/client/bin root@${node}:/usr/local/kubernetes/
  8. ssh root@${node} "echo 'export PATH=\$PATH:/usr/local/kubernetes/bin' >>/etc/bashrc "
  9. done

5.2 创建kubectl TLS证书与私钥

kubectl 与 apiserver https 安全端口通信,apiserver 对提供的证书进行认证和授权。
kubectl 作为集群的管理工具,需要被授予最高权限。这里创建具有最高权限的 admin 证书。

5.2.1 创建kubectl证书签名请求

  1. # kube-apiserver 使用 RBAC 对客户端(如 kubelet、kube-proxy等)请求进行授权;
  2. # kube-apiserver 预定义一部分 RBAC,含Role/ RoleBinding,ClusterRole/ ClusterRoleBinding;
  3. # 如 ClusterRoleBinding将 Group system:masters 与 ClusterRole cluster-admin 绑定

二进制安装kubernetes集群-1.部署说明及基础环境

1. 部署信息

1.1 集群方案

1.1.1 组件说明

  • 操作系统:CentOS Linux release 7.9.2009 (Core)
  • 版本:Kubenetes 1.20.7(生产环境建议使用小版本大于5的包,如1.20.5以上)
  • etcd: 3.3.11
  • 网络方案:Calico
  • 容器:docker-ce 18.09.6
  • 插件:
    • CoreDns
    • Dashboard
    • Metrics-Server
    • EFK(ElasticSearch、Fluentd、Kibana)
  • 镜像仓库
    • docker registry
    • harbor
  • ingress控制器:traefik

1.1.2 部署拓扑

本文采用外置etcd的方式部署

title

实际部署

title

1.1.3 部署说明

  • Master 含有kube-apiserver、kube-controller-manager、kube-scheduler三个服务组件:

    • kube-apiserver:提供了HTTP Rest接口的关键服务进程,是kubernetes里所有资源的增删改查等操作的唯一入口,也是集群的入口进程。
    • kube-controller-manager:kubernetes里所有对象的自动化控制中心,是资源的“指挥中心”。
    • kube-scheduler:负责资源调度的进程,相当于公交公司的“调度中心”。
  • Node 含有服务组件:kubelet、kube-proxy、docker-ce;是kubernetes集群的工作负载节点。Master为其分配工作,当某个Node宕机时,Master会将其工作负载自动转移到其他节点。

    • kubelet:负责Pod对应的容器的创建、启停等任务,同时与Master节点密切协作,实现集群管理的基本功能。
    • kube-proxy:实现kubernetes Service的通信与负载均衡机制的重要组件。
    • docker:docker引擎,负责本机的容器创建和管理工作。
  • etcd 一个键值存储仓库,用于配置共享和服务发现。

  • 特别注意:在实际生产环境中,我们可能需要ingress等组件在master节点上调度,因此我们在master节点上也需要安装docker

二进制部署kubernetes集群-3. kubernetes安全机制与CA证书创建

3.1 CA证书与秘钥

3.1.1 cfssl工具

本文档采用 CloudFlarePKI 工具集 cfssl 来生成 Certificate Authority (CA) 证书和秘钥文件,CA 是自签名的证书,用来签名后续创建的其它 TLS证书。

  1. mkdir -p /usr/local/cfssl/bin
  2. cd /usr/local/cfssl/bin
  3. wget https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssl_1.5.0_linux_amd64 -O cfssl
  4. wget https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssl-certinfo_1.5.0_linux_amd64 -O cfssl-certinfo
  5. wget https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssljson_1.5.0_linux_amd64 -O cfssljson
  6. chmod +x cfssl cfssl-certinfo cfssljson
  7. echo 'export PATH=$PATH:/usr/local/cfssl/bin' >>/etc/bashrc

3.1.2 生成CA配置文件

CA 证书是集群所有节点共享的,只需要创建一个 CA 证书,后续创建的所有证书都由它签名。
CA 配置文件用于配置根证书的使用场景 (profile) 和具体参数 (usage,过期时间、服务端认证、客户端认证、加密等),后续在签名其它证书时需要指定特定场景。

  1. # 创建工作目录
  2. mkdir -p /opt/k8s/
  3. cd /opt/k8s
  4. # 生成CA配置文件模板
  5. cfssl print-defaults config > config.json
  6. # 生成CA证书签名请求文件模板
  7. cfssl print-defaults csr > csr.json

3.1.3 CA配置文件

  1. # ca-config.jso

二进制部署kubernetes集群-2.haproxy+keepalived安装

2. keepalived和haproxy安装

参照本站文档:haproxy安装及配置详解haproxy+keepalived实现高可用

2.1 安装haproxy+keepalived

  1. yum install haproxy keepalived -y

2.2 haproxy配置

  1. grep -v ^# /etc/haproxy/haproxy.cfg
  2. global
  3. chroot /var/lib/haproxy
  4. daemon
  5. group haproxy
  6. user haproxy
  7. maxconn 4000
  8. pidfile /var/run/haproxy.pid
  9. log 127.0.0.1 local0 info
  10. defaults
  11. log global
  12. maxconn 4000
  13. option redispatch
  14. retries 3
  15. timeout http-request 10s
  16. timeout queue 1m
  17. timeout connect 10s
  18. timeout client 1m
  19. timeout server 1m
  20. timeout check 10s
  21. # haproxy监控页
  22. listen stats
  23. bind 0.0.0.0:1080
  24. mode http
  25. stats enable
  26. stats uri /
  27. stats realm Kuberentes\ Haproxy
  28. stats auth admin:admin
  29. stats refresh 30s
  30. stats show-node
  31. stats show-legends
  32. stats hide-version
  33. frontend kube-api-https_frontend
  34. bind 10.28.118.184:6443
  35. mode tcp
  36. default_backend kube-api-https_backend
  37. backend kube-api-https_backe