三种安装方法:

1.kubeadm

2.kubespray

3.二进制安装

kubespray安装kubernetes集群

优点:

1.kuberspray对比kubeadm更加简洁内部集成了kubeadm与ansible

缺点:

1.全程自动化排错成本高

2.主节点也要装了工作节点,如不需要使用可在主节点打污点标签

  1. # 一、使用Kubespray部署Kubernetes生产集群
  2.  
  3. ## 1. 服务器说明
  4. #### 1.1. 节点要求
  5. ###### 节点数 >=3台
  6. ###### CPU >=2
  7. ###### Memory >=2G
  8. ###### 安全组:关闭(允许节点之间任意端口访问,以及ipip隧道协议通讯)
  9.  
  10. #### 1.2. 演示环境说明
  11. 我们这里使用的是三台centos 7.5的虚拟机,具体信息如下表:
  12. | 系统类型 | IP地址 | 节点角色 | CPU | Memory | Hostname |
  13. | :------: | :--------: | :-------: | :-----: | :---------: | :-----: |
  14. | centos-7.5 | 10.155.19.223 | master | \>=2 | \>=2G | node-1 |
  15. | centos-7.5 | 10.155.19.64 | master | \>=2 | \>=2G | node-2 |
  16. | centos-7.5 | 10.155.19.147 | worker | \>=2 | \>=2G | node-3 |
  17.  
  18. ## 2. 系统设置(所有节点)
  19. > 注意:所有操作使用root用户执行
  20.  
  21. #### 2.1 主机名
  22. 主机名必须合法,并且每个节点都不一样(建议命名规范:数字+字母+中划线组合,不要包含其他特殊字符)。
  23. ```bash
  24. # 查看主机名
  25. $ hostname
  26. # 修改主机名
  27. $ hostnamectl set-hostname <your_hostname>
  28. ```
  29. #### 2.2 关闭防火墙、selinux、swap,重置iptables
  30. ```bash
  31. # 关闭selinux
  32. $ setenforce 0
  33. $ sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
  34. # 关闭防火墙
  35. $ systemctl stop firewalld && systemctl disable firewalld
  36.  
  37. # 设置iptables规则
  38. $ iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
  39. # 关闭swap
  40. $ swapoff -a && free –h
  41.  
  42. # 关闭dnsmasq(否则可能导致容器无法解析域名)
  43. $ service dnsmasq stop && systemctl disable dnsmasq
  44. ```
  45. #### 2.3 k8s参数设置
  46. ```bash
  47. # 制作配置文件
  48. $ cat > /etc/sysctl.d/kubernetes.conf <<EOF
  49. net.bridge.bridge-nf-call-ip6tables = 1
  50. net.bridge.bridge-nf-call-iptables = 1
  51. net.ipv4.ip_nonlocal_bind = 1
  52. net.ipv4.ip_forward = 1
  53. vm.swappiness = 0
  54. vm.overcommit_memory = 0
  55. EOF
  56. # 生效文件
  57. $ sysctl -p /etc/sysctl.d/kubernetes.conf
  58. ```
  59. #### 2.4 移除docker相关软件包(可选)
  60. ```bash
  61. $ yum remove -y docker*
  62. $ rm -f /etc/docker/daemon.json
  63. ```
  64.  
  65. ## 3. 使用kubespray部署集群
  66.  
  67. 这部分只需要在一个 **操作** 节点执行,可以是集群中的一个节点,也可以是集群之外的节点。甚至可以是你自己的笔记本电脑。我们这里使用更普遍的集群中的任意一个linux节点。
  68.  
  69. #### 3.1 配置免密
  70. 使 **操作** 节点可以免密登录到所有节点
  71. ```bash
  72. # 1. 生成keygen(执行ssh-keygen,一路回车下去)
  73. $ ssh-keygen
  74. # 2. 查看并复制生成的pubkey
  75. $ cat /root/.ssh/id_rsa.pub
  76. # 3. 分别登陆到每个节点上,将pubkey写入/root/.ssh/authorized_keys
  77. $ mkdir -p /root/.ssh
  78. $ echo "<上一步骤复制的pubkey>" >> /root/.ssh/authorized_keys
  79. ```
  80.  
  81. #### 3.2 依赖软件下载、安装
  82. ```bash
  83. # 安装基础软件
  84. $ yum install -y epel-release python36 python36-pip git
  85. # 下载kubespray源码
  86. $ wget https://github.com/kubernetes-sigs/kubespray/archive/v2.15.0.tar.gz
  87. # 解压缩
  88. $ tar -xvf v2.15.0.tar.gz && cd kubespray-2.15.0
  89. # 安装requirements
  90. $ cat requirements.txt
  91. $ pip3.6 install -r requirements.txt
  92.  
  93. ## 如果install遇到问题可以先尝试升级pip
  94. ## $ pip3.6 install --upgrade pip
  95. ```
  96.  
  97. #### 3.3 生成配置
  98. 项目中有一个目录是集群的基础配置,示例配置在目录inventory/sample中,我们复制一份出来作为自己集群的配置
  99. ```bash
  100. # copy一份demo配置,准备自定义
  101. $ cp -rpf inventory/sample inventory/mycluster
  102. ```
  103. 由于kubespray给我们准备了py脚本,可以直接根据环境变量自动生成配置文件,所以我们现在只需要设定好环境变量就可以啦
  104. ```bash
  105. # 使用真实的hostname(否则会自动把你的hostname改成node1/node2...这种哦)
  106. $ export USE_REAL_HOSTNAME=true
  107. # 指定配置文件位置
  108. $ export CONFIG_FILE=inventory/mycluster/hosts.yaml
  109. # 定义ip列表(你的服务器内网ip地址列表,3台及以上,前两台默认为master节点)
  110. $ declare -a IPS=(10.155.19.223 10.155.19.64 10.155.19.147)
  111. # 生成配置文件
  112. $ python3 contrib/inventory_builder/inventory.py ${IPS[@]}
  113. ```
  114. #### 3.4 个性化配置
  115. 配置文件都生成好了,虽然可以直接用,但并不能完全满足大家的个性化需求,比如用docker还是containerddocker的工作目录是否用默认的/var/lib/docker?等等。当然默认的情况kubespray还会到google的官方仓库下载镜像、二进制文件,这个就需要你的服务器可以上外面的网,想上外网也需要修改一些配置。
  116. ```bash
  117. # 定制化配置文件
  118. # 1. 节点组织配置(这里可以调整每个节点的角色)
  119. $ vi inventory/mycluster/hosts.yaml
  120. # 2. containerd配置(教程使用containerd作为容器引擎)
  121. $ vi inventory/mycluster/group_vars/all/containerd.yml
  122. # 3. 全局配置(可以在这配置http(s)代理实现外网访问)
  123. $ vi inventory/mycluster/group_vars/all/all.yml
  124. # 4. k8s集群配置(包括设置容器运行时、svc网段、pod网段等)
  125. $ vi inventory/mycluster/group_vars/k8s-cluster/k8s-cluster.yml
  126. # 5. 修改etcd部署类型为host(默认是docker)
  127. $ vi ./inventory/mycluster/group_vars/etcd.yml
  128. # 6. 附加组件(ingress、dashboard等)
  129. $ vi ./inventory/mycluster/group_vars/k8s-cluster/addons.yml
  130. ```
  131.  
  132. #### 3.5 一键部署
  133. 配置文件都调整好了后,就可以开始一键部署啦,不过部署过程不出意外会非常慢。
  134. 如果您使用的是教程同一个版本建议下使用网盘下载好二进制文件和镜像
  135. ##### 网盘下载二进制(可选)
  136. ###### 链接: https://pan.baidu.com/s/11eDin8BDJVzGgXJW9e6cog 提取码: mrj9
  137. 下载好之后解压到每个节点的根目录即可,解压完成后的目录是/tmp/releases
  138.  
  139. ##### 一键部署
  140. ```bash
  141. # -vvvv会打印最详细的日志信息,建议开启
  142. $ ansible-playbook -i inventory/mycluster/hosts.yaml -b cluster.yml -vvvv
  143. ```
  144. 经过漫长的等待后,如果没有问题,整个集群都部署起来啦
  145.  
  146. ###### 下载镜像(可选)
  147. 为了减少“一键部署”的等待时间,可以在部署的同时,预先下载一些镜像。
  148. ```bash
  149. $ curl https://gitee.com/pa/pub-doc/raw/master/kubespray-v2.15.0-images.sh|bash -x
  150. ```
  151. `重要:此操作需要确保上面的"一键部署"执行后,并成功安装了containerd后即可手动下载镜像)`
  152.  
  153. #### 3.6 清理代理设置
  154. 清理代理设置(运行时不再需要代理,删掉代理配置即可)
  155. ##### 删除docker的http代理(在每个节点执行)
  156.  
  157. ```bash
  158. $ rm -f /etc/systemd/system/containerd.service.d/http-proxy.conf
  159. $ systemctl daemon-reload
  160. $ systemctl restart containerd
  161. ```
  162. ##### 删除yum代理
  163. ```bash
  164. # 把grep出来的代理配置手动删除即可
  165. $ grep 8118 -r /etc/yum*
  166. ```

01-使用Kubespray部署Kubernetes生产集群

  1. # 二、集群冒烟测试
  2. ## 1. 创建nginx ds
  3.  
  4. ```bash
  5. # 写入配置
  6. $ cat > nginx-ds.yml <<EOF
  7. apiVersion: v1
  8. kind: Service
  9. metadata:
  10. name: nginx-ds
  11. labels:
  12. app: nginx-ds
  13. spec:
  14. type: NodePort
  15. selector:
  16. app: nginx-ds
  17. ports:
  18. - name: http
  19. port: 80
  20. targetPort: 80
  21. ---
  22. apiVersion: apps/v1
  23. kind: DaemonSet
  24. metadata:
  25. name: nginx-ds
  26. spec:
  27. selector:
  28. matchLabels:
  29. app: nginx-ds
  30. template:
  31. metadata:
  32. labels:
  33. app: nginx-ds
  34. spec:
  35. containers:
  36. - name: my-nginx
  37. image: nginx:1.19
  38. ports:
  39. - containerPort: 80
  40. EOF
  41.  
  42. # 创建ds
  43. $ kubectl apply -f nginx-ds.yml
  44.  
  45. ```
  46.  
  47. ## 2. 检查各种ip连通性
  48. ```bash
  49. # 检查各 Node 上的 Pod IP 连通性
  50. $ kubectl get pods -o wide
  51.  
  52. # 在每个节点上ping pod ip
  53. $ ping <pod-ip>
  54.  
  55. # 检查service可达性
  56. $ kubectl get svc
  57.  
  58. # 在每个节点上访问服务
  59. $ curl <service-ip>:<port>
  60.  
  61. # 在每个节点检查node-port可用性
  62. $ curl <node-ip>:<port>
  63. ```
  64.  
  65. ## 3. 检查dns可用性
  66. ```bash
  67. # 创建一个nginx pod
  68. $ cat > pod-nginx.yaml <<EOF
  69. apiVersion: v1
  70. kind: Pod
  71. metadata:
  72. name: nginx
  73. spec:
  74. containers:
  75. - name: nginx
  76. image: docker.io/library/nginx:1.19
  77. ports:
  78. - containerPort: 80
  79. EOF
  80.  
  81. # 创建pod
  82. $ kubectl apply -f pod-nginx.yaml
  83.  
  84. # 进入pod,查看dns
  85. $ kubectl exec nginx -it -- /bin/bash
  86.  
  87. # 查看dns配置
  88. root@nginx:/# cat /etc/resolv.conf
  89.  
  90. # 查看名字是否可以正确解析
  91. root@nginx:/# ping nginx-ds
  92. ```
  93. ## 4. 日志功能
  94. 测试使用kubectl查看pod的容器日志
  95. ```bash
  96. $ kubectl get pods
  97. $ kubectl logs <pod-name>
  98. ```
  99.  
  100. ## 5. Exec功能
  101. 测试kubectlexec功能
  102. ```bash
  103. $ kubectl get pods -l app=nginx-ds
  104. $ kubectl exec -it <nginx-pod-name> -- nginx -v
  105. ```

02-集群冒烟测试

  1. # 三、 访问dashboard
  2. ## 1. 创建service
  3. ```bash
  4. $ cat > dashboard-svc.yaml <<EOF
  5. apiVersion: v1
  6. kind: Service
  7. metadata:
  8. namespace: kube-system
  9. name: dashboard
  10. labels:
  11. app: dashboard
  12. spec:
  13. type: NodePort
  14. selector:
  15. k8s-app: kubernetes-dashboard
  16. ports:
  17. - name: https
  18. nodePort: 30000
  19. port: 443
  20. targetPort: 8443
  21. EOF
  22.  
  23. $ kubectl apply -f dashboard-svc.yaml
  24. ```
  25.  
  26. ## 2. 访问dashboard
  27.  
  28. 为了集群安全,从 1.7 开始,dashboard 只允许通过 https 访问,我们使用nodeport的方式暴露服务,可以使用 https://NodeIP:NodePort 地址访问
  29. 关于自定义证书
  30. 默认dashboard的证书是自动生成的,肯定是非安全的证书,如果大家有域名和对应的安全证书可以自己替换掉。使用安全的域名方式访问dashboard
  31. dashboard-all.yaml中增加dashboard启动参数,可以指定证书文件,其中证书文件是通过secret注进来的。
  32.  
  33. > \- tls-cert-file
  34. \- dashboard.cer
  35. \- tls-key-file
  36. \- dashboard.key
  37.  
  38. ## 3. 登录dashboard
  39. Dashboard 默认只支持 token 认证,所以如果使用 KubeConfig 文件,需要在该文件中指定 token,我们这里使用token的方式登录
  40. ```bash
  41. # 创建service account
  42. $ kubectl create sa dashboard-admin -n kube-system
  43.  
  44. # 创建角色绑定关系
  45. $ kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
  46.  
  47. # 查看dashboard-admin的secret名字
  48. $ ADMIN_SECRET=$(kubectl get secrets -n kube-system | grep dashboard-admin | awk '{print $1}')
  49.  
  50. # 打印secret的token
  51. $ kubectl describe secret -n kube-system ${ADMIN_SECRET} | grep -E '^token' | awk '{print $2}'
  52. ```

03-访问dashboar

  1. # 四、集群运维
  2.  
  3. ## 1. Master节点
  4. #### 增加master节点
  5. ```bash
  6. # 1.编辑hosts.yaml,增加master节点配置
  7. $ vi inventory/mycluster/hosts.yaml
  8. # 2.执行cluster.yml(不要用scale.yml)
  9. $ ansible-playbook -i inventory/mycluster/hosts.yaml cluster.yml -b -v
  10. # 3.重启nginx-proxy - 在所有节点执行下面命令重启nginx-proxy
  11. $ docker ps | grep k8s_nginx-proxy_nginx-proxy | awk '{print $1}' | xargs docker restart
  12. ```
  13. #### 删除master节点
  14. `如果你要删除的是配置文件中第一个节点,需要先调整配置,将第一行配置下移,再重新运行cluster.yml,使其变成非第一行配置。举例如下:`
  15. ```bash
  16. # 场景:下线node-1节点
  17. $ vi inventory/mycluster/hosts.yaml
  18. # 变更前的配置
  19. children:
  20. kube-master:
  21. hosts:
  22. node-1:
  23. node-2:
  24. node-3:
  25. # 变更后的配置
  26. children:
  27. kube-master:
  28. hosts:
  29. node-2:
  30. node-1:
  31. node-3:
  32. # 再执行一次cluster.yml
  33. $ ansible-playbook -i inventory/mycluster/hosts.yaml -b cluster.yml
  34. ```
  35. 非第一行的master节点下线流程:
  36. ```bash
  37. # 执行remove-node.yml(不要在hosts.yaml中删除要下线的节点)
  38. $ ansible-playbook -i inventory/mycluster/hosts.yaml remove-node.yml -b -v -e "node=NODE-NAME"
  39. # 同步hosts.yaml(编辑hosts.yaml将下线的节点删除,保持集群状态和配置文件的一致性)
  40. $ vi inventory/mycluster/hosts.yaml
  41. ```
  42.  
  43. ## 2. Worker节点
  44. #### 增加worker节点
  45. ```bash
  46. # 刷新缓存
  47. $ ansible-playbook -i inventory/mycluster/hosts.yaml facts.yml -b -v
  48. # 修改配置hosts.yaml,增加节点
  49. $ vi inventory/mycluster/hosts.yaml
  50. # 执行scale添加节点,--limit限制只在某个固定节点执行
  51. $ ansible-playbook -i inventory/mycluster/hosts.yaml scale.yml --limit=NODE-NAME -b -v
  52. ```
  53. #### 删除worker节点
  54. ```bash
  55. # 此命令可以下线节点,不影响其他正在运行中的节点,并清理节点上所有的容器以及kubelet,恢复初始状态,多个节点逗号分隔
  56. $ ansible-playbook -i inventory/mycluster/hosts.yaml remove-node.yml -b -v -e "node=NODE-NAME-1,NODE-NAME-2,..."
  57. # 同步hosts.yaml(编辑hosts.yaml将下线的节点删除,保持集群状态和配置文件的一致性)
  58. $ vi inventory/mycluster/hosts.yaml
  59. ```
  60. ## 3. ETCD节点
  61. `如果要变更的etcd节点同时也是master或worker节点,需要先将master/worker节点按照前面的文档操作下线,保留纯粹的etcd节点`
  62.  
  63. #### 增加etcd节点
  64. ```bash
  65. # 编辑hosts.yaml(可以增加1个或2个etcd节点配置)
  66. $ vi inventory/mycluster/hosts.yaml
  67. # 更新etcd集群
  68. $ ansible-playbook -i inventory/mycluster/hosts.yaml upgrade-cluster.yml --limit=etcd,kube-master -e ignore_assert_errors=yes -e etcd_retries=10
  69. ```
  70.  
  71. #### 删除etcd节点
  72. ```bash
  73. # 执行remove-node.yml(不要在hosts.yaml中删除要下线的节点)
  74. $ ansible-playbook -i inventory/mycluster/hosts.yaml remove-node.yml -b -v -e "node=NODE-NAME"
  75. # 同步hosts.yaml(编辑hosts.yaml将下线的节点删除,保持集群状态和配置文件的一致性)
  76. $ vi inventory/mycluster/hosts.yaml
  77. # 运行cluster.yml给node节点重新生成etcd节点相关的配置
  78. $ ansible-playbook -i inventory/mycluster/hosts.yaml -b cluster.yml
  79. ```
  80.  
  81. ## 4. 其他常用命令
  82. #### 集群reset
  83. ```bash
  84. # 运行reset.yml一键清理集群
  85. $ ansible-playbook -i inventory/mycluster/hosts.yaml -b -v reset.yml
  86. ```
  87. #### 自定义play起始点
  88. 当我们执行play的过程中如果有问题,需要重新的时候,如果重新执行指令会重新经历前面漫长的等待,这个时候“跳过”功能就显得非常有用
  89. ```bash
  90. # 通过--start-at-task指定从哪个task处开始执行,会跳过前面的任务,举例如下
  91. $ ansible-playbook --start-at-task="reset | gather mounted kubelet dirs"
  92. ```
  93. #### 忽略错误
  94. 当有些错误是我们确认可以接受的或误报的,可以配置ignore_errors: true,避免task出现错误后影响整个流程的执行。
  95. ```bash
  96. # 示例片段如下:
  97. - name: "Remove physical volume from cluster disks."
  98. environment:
  99. PATH: "{{ ansible_env.PATH }}:/sbin"
  100. become: true
  101. command: "pvremove {{ disk_volume_device_1 }} --yes"
  102. ignore_errors: true
  103. ```

04-集群运维

  1. # 集群一键部署 - FAQ
  2.  
  3. ## 1. google相关的镜像、二进制文件下载失败
  4. #### 现象
  5. 错误提示中可以看到诸如googlegoogleapiurl,提示连接超时
  6. #### 分析
  7. 这种一般是没有设置代理(google属于墙外资源,需要代理访问)
  8. 编辑配置文件设置http_proxyhttps_proxy
  9.  
  10. ## 2. TASK [container-engine/containerd : ensure containerd packages are installed]失败
  11. #### 现象
  12. 执行到这个task会卡住很久,并且多次重试后最终退出
  13. #### 分析
  14. containerd下载文件较大,会耗时比较长,网络不好的情况,会下载超时,导致失败。
  15. 可以多尝试几次。如果依然不行可以在每个节点手动下载containerd
  16. ```bash
  17. $ yum -d 2 -y --enablerepo=docker-ce install containerd.io-<containerd-version>

05-集群部署

二进制安装

1.缺点安装比较复杂,难点在于证书认证分发

2.优点在于排错成本低,使用更加丝滑

注意点:

1.etcd集群尽量用宿主机部署

2.etcd集群节点尽量与apiserver进行区分(方便server与api上下线)

3.etcd集群证书单独准备不要与server证书共用(方便etcd扩缩容)etcd扩容需要重新下发证书

4.kubernetes各配置文件要明确端口协议等信息方便监控

5.api-server高可用可通过ingress-nginx进行负载轮询访问添加健康检查功能(实体机可使用keeplive 虚拟ip)

6.网络插件尽量使用calico等不要采用overledy

7.dns插件升级为coredns与kubernetes1.6版本以后节点缓存相契合

8.kubernetes1.20后不支持docker,使用containerd一定要反复测试与三方软件是否兼容

9.节点预先下载好pause镜像。

  1. # 一、基础环境准备
  2.  
  3. `使用二进制方式,手动部署kubernetes高可用集群`
  4. `注意:所有操作使用root用户执行`
  5.  
  6. ## 1. 服务器说明
  7. #### 1.1. 节点要求
  8. ###### 节点数 >=3台
  9. ###### CPU >=2
  10. ###### Memory >=2G
  11. ###### 安全组:关闭(允许节点之间任意端口访问,以及ipip隧道协议通讯)
  12.  
  13. #### 1.2. 演示环境说明
  14. 我们这里使用的是三台centos 7.5的虚拟机,具体信息如下表:
  15. | 系统类型 | IP地址 | 节点角色 | CPU | Memory | Hostname |
  16. | :------: | :--------: | :-------: | :-----: | :---------: | :-----: |
  17. | centos-7.5 | 10.155.19.223 | master | \>=2 | \>=2G | node-1 |
  18. | centos-7.5 | 10.155.19.64 | masterworker | \>=2 | \>=2G | node-2 |
  19. | centos-7.5 | 10.155.19.147 | worker | \>=2 | \>=2G | node-3 |
  20.  
  21. ## 2. 系统设置(所有节点)
  22.  
  23. #### 2.1 主机名
  24. 主机名必须合法,并且每个节点都不一样(建议命名规范:数字+字母+中划线组合,不要包含其他特殊字符)。
  25. ```bash
  26. # 查看主机名
  27. $ hostname
  28. # 修改主机名
  29. $ hostnamectl set-hostname <your_hostname>
  30. # 配置host,问使主节点之间可以通过hostname互相访
  31. $ vi /etc/hosts
  32. # <ip> <hostname>
  33. ```
  34.  
  35. #### 2.2 安装依赖包
  36. ```bash
  37. # yum源更新(可选,如果很久没有更新过建议更新一次)
  38. $ yum update -y
  39. # 安装依赖包
  40. $ yum install -y socat conntrack ipvsadm ipset jq sysstat curl iptables libseccomp yum-utils
  41. ```
  42. #### 2.3 关闭防火墙、selinux、swap,重置iptables
  43. ```bash
  44. # 关闭selinux
  45. $ setenforce 0
  46. $ sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
  47. # 关闭防火墙
  48. $ systemctl stop firewalld && systemctl disable firewalld
  49.  
  50. # 设置iptables规则
  51. $ iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
  52. # 关闭swap
  53. $ swapoff -a && free –h
  54.  
  55. # 关闭dnsmasq(否则可能导致容器无法解析域名)
  56. $ service dnsmasq stop && systemctl disable dnsmasq
  57. ```
  58. #### 2.4 k8s参数设置
  59. ```bash
  60. # 制作配置文件
  61. $ cat > /etc/sysctl.d/kubernetes.conf <<EOF
  62. net.bridge.bridge-nf-call-ip6tables = 1
  63. net.bridge.bridge-nf-call-iptables = 1
  64. net.ipv4.ip_nonlocal_bind = 1
  65. net.ipv4.ip_forward = 1
  66. vm.swappiness = 0
  67. vm.overcommit_memory = 0
  68. EOF
  69. # 生效文件
  70. $ sysctl -p /etc/sysctl.d/kubernetes.conf
  71. ```
  72. #### 2.5 配置免密登录
  73. 为了方便文件的copy我们选择一个中转节点(随便一个节点,可以是集群中的也可以是非集群中的),配置好跟其他所有节点的免密登录
  74. ```bash
  75. # 看看是否已经存在rsa公钥
  76. $ cat ~/.ssh/id_rsa.pub
  77.  
  78. # 如果不存在就创建一个新的
  79. $ ssh-keygen -t rsa
  80.  
  81. # 把id_rsa.pub文件内容copy到其他机器的授权文件中
  82. $ cat ~/.ssh/id_rsa.pub
  83.  
  84. # 在其他节点执行下面命令(包括worker节点)
  85. $ echo "<file_content>" >> ~/.ssh/authorized_keys
  86. ```
  87.  
  88. ## 3. 准备k8s软件包
  89. #### 3.1 软件包下载
  90. `在任意一个节点下载好压缩包后,复制到所有节点即可`
  91. ###### master节点组件:kube-apiserver、kube-controller-manager、kube-scheduler、kubectl
  92. ###### worker节点组件:kubelet、kube-proxy
  93.  
  94. > [点此从网盘下载](https://pan.baidu.com/s/159YL1l_duFtE_2OESBI85Q) 提取码: 7ci3
  95.  
  96. ```bash
  97. # 设定版本号
  98. $ export VERSION=v1.20.2
  99.  
  100. # 下载master节点组件
  101. $ wget https://storage.googleapis.com/kubernetes-release/release/${VERSION}/bin/linux/amd64/kube-apiserver
  102. $ wget https://storage.googleapis.com/kubernetes-release/release/${VERSION}/bin/linux/amd64/kube-controller-manager
  103. $ wget https://storage.googleapis.com/kubernetes-release/release/${VERSION}/bin/linux/amd64/kube-scheduler
  104. $ wget https://storage.googleapis.com/kubernetes-release/release/${VERSION}/bin/linux/amd64/kubectl
  105.  
  106. # 下载worker节点组件
  107. $ wget https://storage.googleapis.com/kubernetes-release/release/${VERSION}/bin/linux/amd64/kube-proxy
  108. $ wget https://storage.googleapis.com/kubernetes-release/release/${VERSION}/bin/linux/amd64/kubelet
  109.  
  110. # 下载etcd组件
  111. $ wget https://github.com/etcd-io/etcd/releases/download/v3.4.10/etcd-v3.4.10-linux-amd64.tar.gz
  112. $ tar -xvf etcd-v3.4.10-linux-amd64.tar.gz
  113. $ mv etcd-v3.4.10-linux-amd64/etcd* .
  114. $ rm -fr etcd-v3.4.10-linux-amd64*
  115.  
  116. # 统一修改文件权限为可执行
  117. $ chmod +x kube*
  118. ```
  119. #### 3.2 软件包分发
  120. 完成下载后,分发文件,将每个节点需要的文件scp过去
  121. ```bash
  122. # 把master相关组件分发到master节点
  123. $ MASTERS=(node-1 node-2)
  124. for instance in ${MASTERS[@]}; do
  125. scp kube-apiserver kube-controller-manager kube-scheduler kubectl root@${instance}:/usr/local/bin/
  126. done
  127.  
  128. # 把worker先关组件分发到worker节点
  129. $ WORKERS=(node-2 node-3)
  130. for instance in ${WORKERS[@]}; do
  131. scp kubelet kube-proxy root@${instance}:/usr/local/bin/
  132. done
  133.  
  134. # 把etcd组件分发到etcd节点
  135. $ ETCDS=(node-1 node-2 node-3)
  136. for instance in ${ETCDS[@]}; do
  137. scp etcd etcdctl root@${instance}:/usr/local/bin/
  138. done
  139. ```

基础环境准备

  1. # 二、生成证书
  2. ## 0. 安装cfssl
  3. cfssl是非常好用的CA工具,我们用它来生成证书和秘钥文件
  4. 安装过程比较简单,如下:
  5. ```bash
  6. # 下载
  7. $ wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/local/bin/cfssl
  8. $ wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O /usr/local/bin/cfssljson
  9.  
  10. # 修改为可执行权限
  11. $ chmod +x /usr/local/bin/cfssl /usr/local/bin/cfssljson
  12.  
  13. # 验证
  14. $ cfssl version
  15. ```
  16.  
  17. ## 1. 根证书
  18.  
  19. 根证书是集群所有节点共享的,只需要创建一个 CA 证书,后续创建的所有证书都由它签名。
  20. 在任意节点(可以免密登录到其他节点)创建一个单独的证书目录,如:`mkdir pki && cd pki`
  21.  
  22. #### 根证书配置文件
  23. ```bash
  24. $ cat > ca-config.json <<EOF
  25. {
  26. "signing": {
  27. "default": {
  28. "expiry": "876000h"
  29. },
  30. "profiles": {
  31. "kubernetes": {
  32. "usages": ["signing", "key encipherment", "server auth", "client auth"],
  33. "expiry": "876000h"
  34. }
  35. }
  36. }
  37. }
  38. EOF
  39.  
  40. $ cat > ca-csr.json <<EOF
  41. {
  42. "CN": "Kubernetes",
  43. "key": {
  44. "algo": "rsa",
  45. "size": 2048
  46. },
  47. "names": [
  48. {
  49. "C": "US",
  50. "L": "Portland",
  51. "O": "Kubernetes",
  52. "OU": "CA",
  53. "ST": "Oregon"
  54. }
  55. ]
  56. }
  57. EOF
  58.  
  59. ```
  60. #### 生成证书和私钥
  61. ```bash
  62. # 生成证书和私钥
  63. $ cfssl gencert -initca ca-csr.json | cfssljson -bare ca
  64. # 生成完成后会有以下文件(我们最终想要的就是ca-key.pem和ca.pem,一个秘钥,一个证书)
  65. $ ls
  66. ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem
  67. ```
  68.  
  69. ## 2. admin客户端证书
  70. #### admin客户端证书配置文件
  71. ```bash
  72. $ cat > admin-csr.json <<EOF
  73. {
  74. "CN": "admin",
  75. "key": {
  76. "algo": "rsa",
  77. "size": 2048
  78. },
  79. "names": [
  80. {
  81. "C": "CN",
  82. "ST": "BeiJing",
  83. "L": "BeiJing",
  84. "O": "system:masters",
  85. "OU": "seven"
  86. }
  87. ]
  88. }
  89. EOF
  90. ```
  91. #### 生成admin客户端证书和私钥
  92. ```bash
  93. $ cfssl gencert \
  94. -ca=ca.pem \
  95. -ca-key=ca-key.pem \
  96. -config=ca-config.json \
  97. -profile=kubernetes \
  98. admin-csr.json | cfssljson -bare admin
  99. ```
  100. ## 3. kubelet客户端证书
  101. Kubernetes使用一种称为Node Authorizer的专用授权模式来授权Kubelets发出的API请求。 Kubelet使用将其标识为system:nodes组中的凭据,其用户名为systemnode:nodeName,接下里就给每个工作节点生成证书。
  102. #### 生成kubelet客户端证书和私钥
  103. ```bash
  104. # 设置你的worker节点列表
  105. $ WORKERS=(node-2 node-3)
  106. $ WORKER_IPS=(10.155.19.64 10.155.19.147)
  107. # 生成所有worker节点的证书配置
  108. $ for ((i=0;i<${#WORKERS[@]};i++)); do
  109. cat > ${WORKERS[$i]}-csr.json <<EOF
  110. {
  111. "CN": "system:node:${WORKERS[$i]}",
  112. "key": {
  113. "algo": "rsa",
  114. "size": 2048
  115. },
  116. "names": [
  117. {
  118. "C": "CN",
  119. "L": "Beijing",
  120. "O": "system:nodes",
  121. "OU": "seven",
  122. "ST": "Beijing"
  123. }
  124. ]
  125. }
  126. EOF
  127. cfssl gencert \
  128. -ca=ca.pem \
  129. -ca-key=ca-key.pem \
  130. -config=ca-config.json \
  131. -hostname=${WORKERS[$i]},${WORKER_IPS[$i]} \
  132. -profile=kubernetes \
  133. ${WORKERS[$i]}-csr.json | cfssljson -bare ${WORKERS[$i]}
  134. done
  135.  
  136. ```
  137.  
  138. ## 4. kube-controller-manager客户端证书
  139. #### kube-controller-manager客户端证书配置文件
  140. ```bash
  141. $ cat > kube-controller-manager-csr.json <<EOF
  142. {
  143. "CN": "system:kube-controller-manager",
  144. "key": {
  145. "algo": "rsa",
  146. "size": 2048
  147. },
  148. "names": [
  149. {
  150. "C": "CN",
  151. "ST": "BeiJing",
  152. "L": "BeiJing",
  153. "O": "system:kube-controller-manager",
  154. "OU": "seven"
  155. }
  156. ]
  157. }
  158. EOF
  159. ```
  160.  
  161. #### 生成kube-controller-manager客户端证书
  162. ```bash
  163. $ cfssl gencert \
  164. -ca=ca.pem \
  165. -ca-key=ca-key.pem \
  166. -config=ca-config.json \
  167. -profile=kubernetes \
  168. kube-controller-manager-csr.json | cfssljson -bare kube-controller-manager
  169. ```
  170.  
  171. ## 5. kube-proxy客户端证书
  172. #### kube-proxy客户端证书配置文件
  173. ```bash
  174. $ cat > kube-proxy-csr.json <<EOF
  175. {
  176. "CN": "system:kube-proxy",
  177. "key": {
  178. "algo": "rsa",
  179. "size": 2048
  180. },
  181. "names": [
  182. {
  183. "C": "CN",
  184. "ST": "BeiJing",
  185. "L": "BeiJing",
  186. "O": "k8s",
  187. "OU": "seven"
  188. }
  189. ]
  190. }
  191. EOF
  192. ```
  193. #### 生成kube-proxy客户端证书
  194. ```bash
  195. $ cfssl gencert \
  196. -ca=ca.pem \
  197. -ca-key=ca-key.pem \
  198. -config=ca-config.json \
  199. -profile=kubernetes \
  200. kube-proxy-csr.json | cfssljson -bare kube-proxy
  201. ```
  202.  
  203. ## 6. kube-scheduler客户端证书
  204. #### kube-scheduler客户端证书配置文件
  205. ```bash
  206. $ cat > kube-scheduler-csr.json <<EOF
  207. {
  208. "CN": "system:kube-scheduler",
  209. "key": {
  210. "algo": "rsa",
  211. "size": 2048
  212. },
  213. "names": [
  214. {
  215. "C": "CN",
  216. "ST": "BeiJing",
  217. "L": "BeiJing",
  218. "O": "system:kube-scheduler",
  219. "OU": "seven"
  220. }
  221. ]
  222. }
  223. EOF
  224. ```
  225. #### 生成kube-scheduler客户端证书
  226. ```bash
  227. $ cfssl gencert \
  228. -ca=ca.pem \
  229. -ca-key=ca-key.pem \
  230. -config=ca-config.json \
  231. -profile=kubernetes \
  232. kube-scheduler-csr.json | cfssljson -bare kube-scheduler
  233. ```
  234.  
  235. ## 7. kube-apiserver服务端证书
  236. #### kube-apiserver服务端证书配置文件
  237. ```bash
  238. $ cat > kubernetes-csr.json <<EOF
  239. {
  240. "CN": "kubernetes",
  241. "key": {
  242. "algo": "rsa",
  243. "size": 2048
  244. },
  245. "names": [
  246. {
  247. "C": "CN",
  248. "ST": "BeiJing",
  249. "L": "BeiJing",
  250. "O": "k8s",
  251. "OU": "seven"
  252. }
  253. ]
  254. }
  255. EOF
  256. ```
  257. #### 生成kube-apiserver服务端证书
  258. 服务端证书与客户端略有不同,客户端需要通过一个名字或者一个ip去访问服务端,所以证书必须要包含客户端所访问的名字或ip,用以客户端验证。
  259. ```bash
  260. # apiserver的service ip地址(一般是svc网段的第一个ip)
  261. $ KUBERNETES_SVC_IP=10.233.0.1
  262. # 所有的master内网ip,逗号分隔(云环境可以加上master公网ip以便支持公网ip访问)
  263. $ MASTER_IPS=10.155.19.223,10.155.19.64,10.155.19.147
  264. # 生成证书
  265. $ cfssl gencert \
  266. -ca=ca.pem \
  267. -ca-key=ca-key.pem \
  268. -config=ca-config.json \
  269. -hostname=${KUBERNETES_SVC_IP},${MASTER_IPS},127.0.0.1,kubernetes,kubernetes.default,kubernetes.default.svc,kubernetes.default.svc.cluster,kubernetes.svc.cluster.local \
  270. -profile=kubernetes \
  271. kubernetes-csr.json | cfssljson -bare kubernetes
  272. ```
  273.  
  274. ## 8. Service Account证书
  275. #### 配置文件
  276. ```bash
  277. $ cat > service-account-csr.json <<EOF
  278. {
  279. "CN": "service-accounts",
  280. "key": {
  281. "algo": "rsa",
  282. "size": 2048
  283. },
  284. "names": [
  285. {
  286. "C": "CN",
  287. "ST": "BeiJing",
  288. "L": "BeiJing",
  289. "O": "k8s",
  290. "OU": "seven"
  291. }
  292. ]
  293. }
  294. EOF
  295. ```
  296. #### 生成证书
  297. ```bash
  298. $ cfssl gencert \
  299. -ca=ca.pem \
  300. -ca-key=ca-key.pem \
  301. -config=ca-config.json \
  302. -profile=kubernetes \
  303. service-account-csr.json | cfssljson -bare service-account
  304. ```
  305.  
  306. ## 9. proxy-client 证书
  307. #### 配置文件
  308. ```bash
  309. $ cat > proxy-client-csr.json <<EOF
  310. {
  311. "CN": "aggregator",
  312. "key": {
  313. "algo": "rsa",
  314. "size": 2048
  315. },
  316. "names": [
  317. {
  318. "C": "CN",
  319. "ST": "BeiJing",
  320. "L": "BeiJing",
  321. "O": "k8s",
  322. "OU": "seven"
  323. }
  324. ]
  325. }
  326. EOF
  327. ```
  328. #### 生成证书
  329. ```bash
  330. $ cfssl gencert \
  331. -ca=ca.pem \
  332. -ca-key=ca-key.pem \
  333. -config=ca-config.json \
  334. -profile=kubernetes \
  335. proxy-client-csr.json | cfssljson -bare proxy-client
  336. ```
  337.  
  338. ## 10. 分发客户端、服务端证书
  339. #### 分发worker节点需要的证书和私钥
  340. ```bash
  341. for instance in ${WORKERS[@]}; do
  342. scp ca.pem ${instance}-key.pem ${instance}.pem root@${instance}:~/
  343. done
  344. ```
  345. #### 分发master节点需要的证书和私钥
  346. > 注意:由于下面分发的证书即包含了etcd的证书也包含了k8s主节点的证书。
  347. > 所以 MASTER_IPS 中必须包含所有 `master` 节点以及 `etcd` 节点。如果没有包含所有etcd节点的证书,需要重新定义,逗号分隔
  348.  
  349. ```bash
  350. OIFS=$IFS
  351. IFS=','
  352. for instance in ${MASTER_IPS}; do
  353. scp ca.pem ca-key.pem kubernetes-key.pem kubernetes.pem \
  354. service-account-key.pem service-account.pem proxy-client.pem proxy-client-key.pem root@${instance}:~/
  355. done
  356. IFS=$OIFS
  357. ```

证书生成

  1. # 三、kubernetes各组件的认证配置
  2. kubernetes的认证配置文件,也叫kubeconfigs,用于让kubernetes的客户端定位kube-apiserver并通过apiserver的安全认证。
  3.  
  4. 接下来我们一起来生成各个组件的kubeconfigs,包括controller-managerkubeletkube-proxyscheduler,以及admin用户。
  5.  
  6. 以下命令需要与上一节“生成证书”在同一个目录下执行
  7. ## 1. kubelet
  8. ```bash
  9. # 指定你的worker列表(hostname),空格分隔
  10. $ WORKERS="node-2 node-3"
  11. $ for instance in ${WORKERS[@]}; do
  12. kubectl config set-cluster kubernetes \
  13. --certificate-authority=ca.pem \
  14. --embed-certs=true \
  15. --server=https://127.0.0.1:6443 \
  16. --kubeconfig=${instance}.kubeconfig
  17.  
  18. kubectl config set-credentials system:node:${instance} \
  19. --client-certificate=${instance}.pem \
  20. --client-key=${instance}-key.pem \
  21. --embed-certs=true \
  22. --kubeconfig=${instance}.kubeconfig
  23.  
  24. kubectl config set-context default \
  25. --cluster=kubernetes \
  26. --user=system:node:${instance} \
  27. --kubeconfig=${instance}.kubeconfig
  28.  
  29. kubectl config use-context default --kubeconfig=${instance}.kubeconfig
  30. done
  31. ```
  32.  
  33. ## 2. kube-proxy
  34. ```bash
  35. kubectl config set-cluster kubernetes \
  36. --certificate-authority=ca.pem \
  37. --embed-certs=true \
  38. --server=https://127.0.0.1:6443 \
  39. --kubeconfig=kube-proxy.kubeconfig
  40.  
  41. kubectl config set-credentials system:kube-proxy \
  42. --client-certificate=kube-proxy.pem \
  43. --client-key=kube-proxy-key.pem \
  44. --embed-certs=true \
  45. --kubeconfig=kube-proxy.kubeconfig
  46.  
  47. kubectl config set-context default \
  48. --cluster=kubernetes \
  49. --user=system:kube-proxy \
  50. --kubeconfig=kube-proxy.kubeconfig
  51.  
  52. kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
  53. ```
  54.  
  55. ## 3. kube-controller-manager
  56. ```bash
  57. kubectl config set-cluster kubernetes \
  58. --certificate-authority=ca.pem \
  59. --embed-certs=true \
  60. --server=https://127.0.0.1:6443 \
  61. --kubeconfig=kube-controller-manager.kubeconfig
  62.  
  63. kubectl config set-credentials system:kube-controller-manager \
  64. --client-certificate=kube-controller-manager.pem \
  65. --client-key=kube-controller-manager-key.pem \
  66. --embed-certs=true \
  67. --kubeconfig=kube-controller-manager.kubeconfig
  68.  
  69. kubectl config set-context default \
  70. --cluster=kubernetes \
  71. --user=system:kube-controller-manager \
  72. --kubeconfig=kube-controller-manager.kubeconfig
  73.  
  74. kubectl config use-context default --kubeconfig=kube-controller-manager.kubeconfig
  75. ```
  76.  
  77. ## 4. kube-scheduler
  78. ```bash
  79. kubectl config set-cluster kubernetes \
  80. --certificate-authority=ca.pem \
  81. --embed-certs=true \
  82. --server=https://127.0.0.1:6443 \
  83. --kubeconfig=kube-scheduler.kubeconfig
  84.  
  85. kubectl config set-credentials system:kube-scheduler \
  86. --client-certificate=kube-scheduler.pem \
  87. --client-key=kube-scheduler-key.pem \
  88. --embed-certs=true \
  89. --kubeconfig=kube-scheduler.kubeconfig
  90.  
  91. kubectl config set-context default \
  92. --cluster=kubernetes \
  93. --user=system:kube-scheduler \
  94. --kubeconfig=kube-scheduler.kubeconfig
  95.  
  96. kubectl config use-context default --kubeconfig=kube-scheduler.kubeconfig
  97. ```
  98.  
  99. ## 5. admin用户配置
  100. admin用户生成kubeconfig配置
  101. ```bash
  102. kubectl config set-cluster kubernetes \
  103. --certificate-authority=ca.pem \
  104. --embed-certs=true \
  105. --server=https://127.0.0.1:6443 \
  106. --kubeconfig=admin.kubeconfig
  107.  
  108. kubectl config set-credentials admin \
  109. --client-certificate=admin.pem \
  110. --client-key=admin-key.pem \
  111. --embed-certs=true \
  112. --kubeconfig=admin.kubeconfig
  113.  
  114. kubectl config set-context default \
  115. --cluster=kubernetes \
  116. --user=admin \
  117. --kubeconfig=admin.kubeconfig
  118.  
  119. kubectl config use-context default --kubeconfig=admin.kubeconfig
  120. ```
  121.  
  122. ## 6. 分发配置文件
  123. ##### 6.1把kubelet和kube-proxy需要的kubeconfig配置分发到每个worker节点
  124. ```bash
  125. $ WORKERS="node-2 node-3"
  126. $ for instance in ${WORKERS[@]}; do
  127. scp ${instance}.kubeconfig kube-proxy.kubeconfig ${instance}:~/
  128. done
  129. ```
  130. ##### 6.2 把kube-controller-manager和kube-scheduler需要的kubeconfig配置分发到master节点
  131. ```bash
  132. $ MASTERS="node-1 node-2"
  133. $ for instance in ${MASTERS[@]}; do
  134. scp admin.kubeconfig kube-controller-manager.kubeconfig kube-scheduler.kubeconfig ${instance}:~/
  135. done
  136. ```

kubernetes各组件认证配置

  1. # 四、部署ETCD集群
  2. Kubernetes组件是无状态的,并在etcd中存储集群状态。 在本小节中,我们将部署三个节点的etcd群集,并对其进行配置以实现高可用性和安全的远程访问。
  3. ## 1. 配置etcd
  4. copy必要的证书文件
  5. ```bash
  6. $ mkdir -p /etc/etcd /var/lib/etcd
  7. $ chmod 700 /var/lib/etcd
  8. $ cp ca.pem kubernetes-key.pem kubernetes.pem /etc/etcd/
  9. ```
  10. 配置etcd.service文件
  11. ```bash
  12. $ ETCD_NAME=$(hostname -s)
  13. $ ETCD_IP=10.155.19.223
  14. # etcd所有节点的ip地址
  15. $ ETCD_NAMES=(node-1 node-2 node-3)
  16. $ ETCD_IPS=(10.155.19.223 10.155.19.64 10.155.19.147)
  17. $ cat <<EOF > /etc/systemd/system/etcd.service
  18. [Unit]
  19. Description=etcd
  20. Documentation=https://github.com/coreos
  21.  
  22. [Service]
  23. Type=notify
  24. ExecStart=/usr/local/bin/etcd \\
  25. --name ${ETCD_NAME} \\
  26. --cert-file=/etc/etcd/kubernetes.pem \\
  27. --key-file=/etc/etcd/kubernetes-key.pem \\
  28. --peer-cert-file=/etc/etcd/kubernetes.pem \\
  29. --peer-key-file=/etc/etcd/kubernetes-key.pem \\
  30. --trusted-ca-file=/etc/etcd/ca.pem \\
  31. --peer-trusted-ca-file=/etc/etcd/ca.pem \\
  32. --peer-client-cert-auth \\
  33. --client-cert-auth \\
  34. --initial-advertise-peer-urls https://${ETCD_IP}:2380 \\
  35. --listen-peer-urls https://${ETCD_IP}:2380 \\
  36. --listen-client-urls https://${ETCD_IP}:2379,https://127.0.0.1:2379 \\
  37. --advertise-client-urls https://${ETCD_IP}:2379 \\
  38. --initial-cluster-token etcd-cluster-0 \\
  39. --initial-cluster ${ETCD_NAMES[0]}=https://${ETCD_IPS[0]}:2380,${ETCD_NAMES[1]}=https://${ETCD_IPS[1]}:2380,${ETCD_NAMES[2]}=https://${ETCD_IPS[2]}:2380 \\
  40. --initial-cluster-state new \\
  41. --data-dir=/var/lib/etcd
  42. Restart=on-failure
  43. RestartSec=5
  44.  
  45. [Install]
  46. WantedBy=multi-user.target
  47. EOF
  48. ```
  49. ## 2. 启动etcd集群
  50. 所有etcd节点都配置好etcd.service后,启动etcd集群
  51. ```bash
  52. $ systemctl daemon-reload && systemctl enable etcd && systemctl restart etcd
  53. ```
  54.  
  55. ## 3. 验证etcd集群
  56. 验证etcd集群状态
  57. ```bash
  58. ETCDCTL_API=3 etcdctl member list \
  59. --endpoints=https://127.0.0.1:2379 \
  60. --cacert=/etc/etcd/ca.pem \
  61. --cert=/etc/etcd/kubernetes.pem \
  62. --key=/etc/etcd/kubernetes-key.pem
  63. ```

部署etcd集群

  1. # 五、部署kubernetes控制平面
  2. 这部分我们部署kubernetes的控制平面,每个组件有多个点保证高可用。实例中我们在两个节点上部署 API ServerScheduler Controller Manager。当然你也可以按照教程部署三个节点的高可用,操作都是一致的。
  3.  
  4. > 下面的所有命令都是运行在每个master节点的,我们的实例中是 node-1 node-2
  5.  
  6. ## 1. 配置 API Server
  7.  
  8. ```bash
  9. # 创建kubernetes必要目录
  10. $ mkdir -p /etc/kubernetes/ssl
  11. # 准备证书文件
  12. $ mv ca.pem ca-key.pem kubernetes-key.pem kubernetes.pem \
  13. service-account-key.pem service-account.pem \
  14. proxy-client.pem proxy-client-key.pem \
  15. /etc/kubernetes/ssl
  16.  
  17. # 配置kube-apiserver.service
  18. # 本机内网ip
  19. $ IP=10.155.19.223
  20. # apiserver实例数
  21. $ APISERVER_COUNT=2
  22. # etcd节点
  23. $ ETCD_ENDPOINTS=(10.155.19.223 10.155.19.64 10.155.19.147)
  24. # 创建 apiserver service
  25. $ cat <<EOF > /etc/systemd/system/kube-apiserver.service
  26. [Unit]
  27. Description=Kubernetes API Server
  28. Documentation=https://github.com/kubernetes/kubernetes
  29.  
  30. [Service]
  31. ExecStart=/usr/local/bin/kube-apiserver \\
  32. --advertise-address=${IP} \\
  33. --allow-privileged=true \\
  34. --apiserver-count=${APISERVER_COUNT} \\
  35. --audit-log-maxage=30 \\
  36. --audit-log-maxbackup=3 \\
  37. --audit-log-maxsize=100 \\
  38. --audit-log-path=/var/log/audit.log \\
  39. --authorization-mode=Node,RBAC \\
  40. --bind-address=0.0.0.0 \\
  41. --client-ca-file=/etc/kubernetes/ssl/ca.pem \\
  42. --enable-admission-plugins=NamespaceLifecycle,NodeRestriction,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota \\
  43. --etcd-cafile=/etc/kubernetes/ssl/ca.pem \\
  44. --etcd-certfile=/etc/kubernetes/ssl/kubernetes.pem \\
  45. --etcd-keyfile=/etc/kubernetes/ssl/kubernetes-key.pem \\
  46. --etcd-servers=https://${ETCD_ENDPOINTS[0]}:2379,https://${ETCD_ENDPOINTS[1]}:2379,https://${ETCD_ENDPOINTS[2]}:2379,https://${ETCD_ENDPOINTS[3]}:2379 \\
  47. --event-ttl=1h \\
  48. --kubelet-certificate-authority=/etc/kubernetes/ssl/ca.pem \\
  49. --kubelet-client-certificate=/etc/kubernetes/ssl/kubernetes.pem \\
  50. --kubelet-client-key=/etc/kubernetes/ssl/kubernetes-key.pem \\
  51. --service-account-issuer=api \\
  52. --service-account-key-file=/etc/kubernetes/ssl/service-account.pem \\
  53. --service-account-signing-key-file=/etc/kubernetes/ssl/service-account-key.pem \\
  54. --api-audiences=api,vault,factors \\
  55. --service-cluster-ip-range=10.233.0.0/16 \\
  56. --service-node-port-range=30000-32767 \\
  57. --proxy-client-cert-file=/etc/kubernetes/ssl/proxy-client.pem \\
  58. --proxy-client-key-file=/etc/kubernetes/ssl/proxy-client-key.pem \\
  59. --runtime-config=api/all=true \\
  60. --requestheader-client-ca-file=/etc/kubernetes/ssl/ca.pem \\
  61. --requestheader-allowed-names=aggregator \\
  62. --requestheader-extra-headers-prefix=X-Remote-Extra- \\
  63. --requestheader-group-headers=X-Remote-Group \\
  64. --requestheader-username-headers=X-Remote-User \\
  65. --tls-cert-file=/etc/kubernetes/ssl/kubernetes.pem \\
  66. --tls-private-key-file=/etc/kubernetes/ssl/kubernetes-key.pem \\
  67. --v=1
  68. Restart=on-failure
  69. RestartSec=5
  70.  
  71. [Install]
  72. WantedBy=multi-user.target
  73. EOF
  74. ```
  75.  
  76. ## 2. 配置kube-controller-manager
  77. ```bash
  78. # 准备kubeconfig配置文件
  79. $ mv kube-controller-manager.kubeconfig /etc/kubernetes/
  80.  
  81. # 创建 kube-controller-manager.service
  82. $ cat <<EOF > /etc/systemd/system/kube-controller-manager.service
  83. [Unit]
  84. Description=Kubernetes Controller Manager
  85. Documentation=https://github.com/kubernetes/kubernetes
  86.  
  87. [Service]
  88. ExecStart=/usr/local/bin/kube-controller-manager \\
  89. --bind-address=0.0.0.0 \\
  90. --cluster-cidr=10.200.0.0/16 \\
  91. --cluster-name=kubernetes \\
  92. --cluster-signing-cert-file=/etc/kubernetes/ssl/ca.pem \\
  93. --cluster-signing-key-file=/etc/kubernetes/ssl/ca-key.pem \\
  94. --cluster-signing-duration=876000h0m0s \\
  95. --kubeconfig=/etc/kubernetes/kube-controller-manager.kubeconfig \\
  96. --leader-elect=true \\
  97. --root-ca-file=/etc/kubernetes/ssl/ca.pem \\
  98. --service-account-private-key-file=/etc/kubernetes/ssl/service-account-key.pem \\
  99. --service-cluster-ip-range=10.233.0.0/16 \\
  100. --use-service-account-credentials=true \\
  101. --v=1
  102. Restart=on-failure
  103. RestartSec=5
  104.  
  105. [Install]
  106. WantedBy=multi-user.target
  107. EOF
  108.  
  109. ```
  110.  
  111. ## 3. 配置kube-scheduler
  112. ```bash
  113. # 准备kubeconfig配置文件
  114. $ mv kube-scheduler.kubeconfig /etc/kubernetes
  115.  
  116. # 创建 scheduler service 文件
  117. $ cat <<EOF > /etc/systemd/system/kube-scheduler.service
  118. [Unit]
  119. Description=Kubernetes Scheduler
  120. Documentation=https://github.com/kubernetes/kubernetes
  121.  
  122. [Service]
  123. ExecStart=/usr/local/bin/kube-scheduler \\
  124. --authentication-kubeconfig=/etc/kubernetes/kube-scheduler.kubeconfig \\
  125. --authorization-kubeconfig=/etc/kubernetes/kube-scheduler.kubeconfig \\
  126. --kubeconfig=/etc/kubernetes/kube-scheduler.kubeconfig \\
  127. --leader-elect=true \\
  128. --bind-address=0.0.0.0 \\
  129. --port=0 \\
  130. --v=1
  131. Restart=on-failure
  132. RestartSec=5
  133.  
  134. [Install]
  135. WantedBy=multi-user.target
  136. EOF
  137. ```
  138.  
  139. ## 4. 启动服务
  140. ```bash
  141. $ systemctl daemon-reload
  142. $ systemctl enable kube-apiserver
  143. $ systemctl enable kube-controller-manager
  144. $ systemctl enable kube-scheduler
  145. $ systemctl restart kube-apiserver
  146. $ systemctl restart kube-controller-manager
  147. $ systemctl restart kube-scheduler
  148. ```
  149.  
  150. ## 5. 服务验证
  151. ##### 端口验证
  152. ```bash
  153. # 各个组件的监听端口
  154. $ netstat -ntlp
  155. tcp 0 0 127.0.0.1:2379 0.0.0.0:* LISTEN 6887/etcd
  156. tcp 0 0 10.155.19.223:2379 0.0.0.0:* LISTEN 6887/etcd
  157. tcp 0 0 10.155.19.223:2380 0.0.0.0:* LISTEN 6887/etcd
  158. tcp6 0 0 :::6443 :::* LISTEN 4088/kube-apiserver
  159. tcp6 0 0 :::10252 :::* LISTEN 2910/kube-controlle
  160. tcp6 0 0 :::10257 :::* LISTEN 2910/kube-controlle
  161. tcp6 0 0 :::10259 :::* LISTEN 4128/kube-scheduler
  162. ```
  163.  
  164. ##### 系统日志验证
  165. ```bash
  166. # 查看系统日志是否有组件的错误日志
  167. $ journalctl -f
  168. ```
  169.  
  170. ## 6. 配置kubectl
  171. kubectl是用来管理kubernetes集群的客户端工具,前面我们已经下载到了所有的master节点。下面我们来配置这个工具,让它可以使用。
  172. ```bash
  173. # 创建kubectl的配置目录
  174. $ mkdir ~/.kube/
  175. # 把管理员的配置文件移动到kubectl的默认目录
  176. $ mv ~/admin.kubeconfig ~/.kube/config
  177. # 测试
  178. $ kubectl get nodes
  179. ```
  180.  
  181. 在执行 kubectl execrunlogs 等命令时,apiserver 会转发到 kubelet。这里定义 RBAC 规则,授权 apiserver 调用 kubelet API
  182.  
  183. ```bash
  184. $ kubectl create clusterrolebinding kube-apiserver:kubelet-apis --clusterrole=system:kubelet-api-admin --user kubernetes
  185. ```

部署kubernetes控制平面

  1. # 六、部署kubernetes工作节点
  2. 这部分我们部署kubernetes的工作节点。实例中我们有两个工作节点,一个是独立的工作节点,一个是跟master在一起的节点。
  3. 在每个节点上我们会部署kubeletkube-proxycontainer runtimecninginx-proxy
  4.  
  5. > 下面的操作需要在每一个工作节点执行
  6.  
  7. ## 1. Container Runtime - Containerd
  8. #### 1.1 软件包下载
  9. ```bash
  10. # 设定containerd的版本号
  11. $ VERSION=1.4.3
  12. # 下载压缩包
  13. $ wget https://github.com/containerd/containerd/releases/download/v${VERSION}/cri-containerd-cni-${VERSION}-linux-amd64.tar.gz
  14. ```
  15. #### 1.2 整理压缩文件
  16. 下载后的文件是一个tar.gz,是一个allinone的包,包括了runccirctlctrcontainerd等容器运行时以及cni相关的文件,解压缩到一个独立的目录中
  17. ```bash
  18. # 解压缩
  19. $ tar -xvf cri-containerd-cni-${VERSION}-linux-amd64.tar.gz
  20. # 复制需要的文件
  21. $ cp etc/crictl.yaml /etc/
  22. $ cp etc/systemd/system/containerd.service /etc/systemd/system/
  23. $ cp -r usr /
  24. ```
  25. #### 1.3 containerd配置文件
  26. ```bash
  27. $ mkdir -p /etc/containerd
  28. # 默认配置生成配置文件
  29. $ containerd config default > /etc/containerd/config.toml
  30. # 定制化配置(可选)
  31. $ vi /etc/containerd/config.toml
  32. ```
  33. #### 1.4 启动containerd
  34. ```bash
  35. $ systemctl enable containerd
  36. $ systemctl restart containerd
  37. # 检查状态
  38. $ systemctl status containerd
  39. ```
  40.  
  41. ## 2. 配置kubelet
  42.  
  43. ##### 准备kubelet配置
  44. ```bash
  45. $ mkdir -p /etc/kubernetes/ssl/
  46. $ mv ${HOSTNAME}-key.pem ${HOSTNAME}.pem ca.pem ca-key.pem /etc/kubernetes/ssl/
  47. $ mv ${HOSTNAME}.kubeconfig /etc/kubernetes/kubeconfig
  48. $ IP=10.155.19.64
  49. # 写入kubelet配置文件
  50. $ cat <<EOF > /etc/kubernetes/kubelet-config.yaml
  51. kind: KubeletConfiguration
  52. apiVersion: kubelet.config.k8s.io/v1beta1
  53. authentication:
  54. anonymous:
  55. enabled: false
  56. webhook:
  57. enabled: true
  58. x509:
  59. clientCAFile: "/etc/kubernetes/ssl/ca.pem"
  60. authorization:
  61. mode: Webhook
  62. clusterDomain: "cluster.local"
  63. clusterDNS:
  64. - "169.254.25.10"
  65. podCIDR: "10.200.0.0/16"
  66. address: ${IP}
  67. readOnlyPort: 0
  68. staticPodPath: /etc/kubernetes/manifests
  69. healthzPort: 10248
  70. healthzBindAddress: 127.0.0.1
  71. kubeletCgroups: /systemd/system.slice
  72. resolvConf: "/etc/resolv.conf"
  73. runtimeRequestTimeout: "15m"
  74. kubeReserved:
  75. cpu: 200m
  76. memory: 512M
  77. tlsCertFile: "/etc/kubernetes/ssl/${HOSTNAME}.pem"
  78. tlsPrivateKeyFile: "/etc/kubernetes/ssl/${HOSTNAME}-key.pem"
  79. EOF
  80. ```
  81. ##### 配置kubelet服务
  82. ```bash
  83. $ cat <<EOF > /etc/systemd/system/kubelet.service
  84. [Unit]
  85. Description=Kubernetes Kubelet
  86. Documentation=https://github.com/kubernetes/kubernetes
  87. After=containerd.service
  88. Requires=containerd.service
  89.  
  90. [Service]
  91. ExecStart=/usr/local/bin/kubelet \\
  92. --config=/etc/kubernetes/kubelet-config.yaml \\
  93. --container-runtime=remote \\
  94. --container-runtime-endpoint=unix:///var/run/containerd/containerd.sock \\
  95. --image-pull-progress-deadline=2m \\
  96. --kubeconfig=/etc/kubernetes/kubeconfig \\
  97. --network-plugin=cni \\
  98. --node-ip=${IP} \\
  99. --register-node=true \\
  100. --v=2
  101. Restart=on-failure
  102. RestartSec=5
  103.  
  104. [Install]
  105. WantedBy=multi-user.target
  106. EOF
  107. ```
  108.  
  109. ## 3. 配置nginx-proxy
  110. nginx-proxy是一个用于worker节点访问apiserver的一个代理,是apiserver一个优雅的高可用方案,它使用kubeletstaticpod方式启动,让每个节点都可以均衡的访问到每个apiserver服务,优雅的替代了通过虚拟ip访问apiserver的方式。
  111. > Tips: nginx-proxy 只需要在没有 apiserver 的节点部署哦~
  112.  
  113. ##### 3.1 nginx配置文件
  114. ```bash
  115. $ mkdir -p /etc/nginx
  116. # master ip列表
  117. $ MASTER_IPS=(10.155.19.223 10.155.19.64)
  118. # 执行前请先copy一份,并修改好upstream的 'server' 部分配置
  119. $ cat <<EOF > /etc/nginx/nginx.conf
  120. error_log stderr notice;
  121.  
  122. worker_processes 2;
  123. worker_rlimit_nofile 130048;
  124. worker_shutdown_timeout 10s;
  125.  
  126. events {
  127. multi_accept on;
  128. use epoll;
  129. worker_connections 16384;
  130. }
  131.  
  132. stream {
  133. upstream kube_apiserver {
  134. least_conn;
  135. server ${MASTER_IPS[0]}:6443;
  136. server ${MASTER_IPS[1]}:6443;
  137. ...
  138. server ${MASTER_IPS[N]}:6443;
  139. }
  140.  
  141. server {
  142. listen 127.0.0.1:6443;
  143. proxy_pass kube_apiserver;
  144. proxy_timeout 10m;
  145. proxy_connect_timeout 1s;
  146. }
  147. }
  148.  
  149. http {
  150. aio threads;
  151. aio_write on;
  152. tcp_nopush on;
  153. tcp_nodelay on;
  154.  
  155. keepalive_timeout 5m;
  156. keepalive_requests 100;
  157. reset_timedout_connection on;
  158. server_tokens off;
  159. autoindex off;
  160.  
  161. server {
  162. listen 8081;
  163. location /healthz {
  164. access_log off;
  165. return 200;
  166. }
  167. location /stub_status {
  168. stub_status on;
  169. access_log off;
  170. }
  171. }
  172. }
  173. EOF
  174. ```
  175. ##### 3.2 nginx manifest
  176. ```bash
  177. $ mkdir -p /etc/kubernetes/manifests/
  178. $ cat <<EOF > /etc/kubernetes/manifests/nginx-proxy.yaml
  179. apiVersion: v1
  180. kind: Pod
  181. metadata:
  182. name: nginx-proxy
  183. namespace: kube-system
  184. labels:
  185. addonmanager.kubernetes.io/mode: Reconcile
  186. k8s-app: kube-nginx
  187. spec:
  188. hostNetwork: true
  189. dnsPolicy: ClusterFirstWithHostNet
  190. nodeSelector:
  191. kubernetes.io/os: linux
  192. priorityClassName: system-node-critical
  193. containers:
  194. - name: nginx-proxy
  195. image: docker.io/library/nginx:1.19
  196. imagePullPolicy: IfNotPresent
  197. resources:
  198. requests:
  199. cpu: 25m
  200. memory: 32M
  201. securityContext:
  202. privileged: true
  203. livenessProbe:
  204. httpGet:
  205. path: /healthz
  206. port: 8081
  207. readinessProbe:
  208. httpGet:
  209. path: /healthz
  210. port: 8081
  211. volumeMounts:
  212. - mountPath: /etc/nginx
  213. name: etc-nginx
  214. readOnly: true
  215. volumes:
  216. - name: etc-nginx
  217. hostPath:
  218. path: /etc/nginx
  219. EOF
  220. ```
  221. ## 4. 配置kube-proxy
  222. ##### 4.1 配置文件
  223. ```bash
  224. $ mv kube-proxy.kubeconfig /etc/kubernetes/
  225. # 创建 kube-proxy-config.yaml
  226. $ cat <<EOF > /etc/kubernetes/kube-proxy-config.yaml
  227. apiVersion: kubeproxy.config.k8s.io/v1alpha1
  228. kind: KubeProxyConfiguration
  229. bindAddress: 0.0.0.0
  230. clientConnection:
  231. kubeconfig: "/etc/kubernetes/kube-proxy.kubeconfig"
  232. clusterCIDR: "10.200.0.0/16"
  233. mode: ipvs
  234. EOF
  235. ```
  236. ##### 4.2 kube-proxy 服务文件
  237. ```bash
  238. $ cat <<EOF > /etc/systemd/system/kube-proxy.service
  239. [Unit]
  240. Description=Kubernetes Kube Proxy
  241. Documentation=https://github.com/kubernetes/kubernetes
  242.  
  243. [Service]
  244. ExecStart=/usr/local/bin/kube-proxy \\
  245. --config=/etc/kubernetes/kube-proxy-config.yaml
  246. Restart=on-failure
  247. RestartSec=5
  248.  
  249. [Install]
  250. WantedBy=multi-user.target
  251. EOF
  252. ```
  253.  
  254. ## 5. 启动服务
  255. ```bash
  256. $ systemctl daemon-reload
  257. $ systemctl enable kubelet kube-proxy
  258. $ systemctl restart kubelet kube-proxy
  259. $ journalctl -f -u kubelet
  260. $ journalctl -f -u kube-proxy
  261. ```
  262.  
  263. ## 6. 手动下载镜像(服务器无法访问外网情况)
  264. 在每个工作节点下载pause镜像
  265. ```bash
  266. $ crictl pull registry.cn-hangzhou.aliyuncs.com/kubernetes-kubespray/pause:3.2
  267. $ ctr -n k8s.io i tag registry.cn-hangzhou.aliyuncs.com/kubernetes-kubespray/pause:3.2 k8s.gcr.io/pause:3.2
  268. ```

部署kubernetes工作节点

  1. # 七、网络插件-Calico
  2. 这部分我们部署kubernetes的网络查件 CNI
  3.  
  4. 文档地址:https://docs.projectcalico.org/getting-started/kubernetes/self-managed-onprem/onpremises
  5.  
  6. ## 1. 下载文件说明
  7. 文档中有两个配置,50以下节点和50以上节点,它们的主要区别在于这个:typha
  8. 当节点数比较多的情况下,Calico Felix组件可通过 Typha 直接和 Etcd 进行数据交互,不通过 kube-apiserver,降低kube-apiserver的压力。大家根据自己的实际情况选择下载。
  9. 下载后的文件是一个all-in-oneyaml文件,我们只需要在此基础上做少许修改即可。
  10.  
  11. ## 2. 修改IP自动发现
  12. > kubelet的启动参数中存在--node-ip的时候,以host-network模式启动的podstatus.hostIP字段就会自动填入kubelet中指定的ip地址。
  13.  
  14. 修改前:
  15. ```bash
  16. - name: IP
  17. value: "autodetect"
  18. ```
  19. 修改后:
  20. ```bash
  21. - name: IP
  22. valueFrom:
  23. fieldRef:
  24. fieldPath: status.hostIP
  25. ```
  26. ## 3. 修改 CIDR
  27. 修改前:
  28. ```bash
  29. # - name: CALICO_IPV4POOL_CIDR
  30. # value: "192.168.0.0/16"
  31. ```
  32. 修改后(修改成你自己的value哦,我这里是10.200.0.0/16
  33. ```bash
  34. - name: CALICO_IPV4POOL_CIDR
  35. value: "10.200.0.0/16"
  36. ```

网络插件calico

  1. # 八、DNS插件-CoreDNS
  2. 这部分我们部署kubernetesDNS插件 - CoreDNS
  3.  
  4. 在早期的版本中dns组件以pod形式独立运行,为集群提供dns服务,所有的pod都会请求同一个dns服务。
  5. kubernetes 1.18版本开始NodeLocal DnsCache功能进入stable状态。
  6. NodeLocal DNSCache通过daemon-set的形式运行在每个工作节点,作为节点上poddns缓存代理,从而避免了iptablesDNAT规则和connection tracking。极大提升了dns的性能。
  7.  
  8. ## 1. 部署CoreDNS
  9. ```bash
  10. # 设置 coredns 的 cluster-ip
  11. $ COREDNS_CLUSTER_IP=10.233.0.10
  12. # 下载coredns配置all-in-one(addons/coredns.yaml)
  13. # 替换cluster-ip
  14. $ sed -i "s/\${COREDNS_CLUSTER_IP}/${COREDNS_CLUSTER_IP}/g" coredns.yaml
  15. # 创建 coredns
  16. $ kubectl apply -f coredns.yaml
  17. ```
  18.  
  19. ## 2. 部署NodeLocal DNSCache
  20. ```bash
  21. # 设置 coredns 的 cluster-ip
  22. $ COREDNS_CLUSTER_IP=10.233.0.10
  23. # 下载nodelocaldns配置all-in-one(addons/nodelocaldns.yaml)
  24. # 替换cluster-ip
  25. $
  26. # 创建 nodelocaldns
  27. $ kubectl apply -f nodelocaldns.yaml
  28. ```
  29.  
  30. ##### 官方文档地址
  31. > **coredns官方文档**:https://coredns.io/plugins/kubernetes/
  32. > **NodeLocal DNSCache**:https://kubernetes.io/docs/tasks/administer-cluster/nodelocaldns/

dns插件CoreDns

  1. # 九、集群冒烟测试
  2. ## 1. 创建nginx ds
  3.  
  4. ```bash
  5. # 写入配置
  6. $ cat > nginx-ds.yml <<EOF
  7. apiVersion: v1
  8. kind: Service
  9. metadata:
  10. name: nginx-ds
  11. labels:
  12. app: nginx-ds
  13. spec:
  14. type: NodePort
  15. selector:
  16. app: nginx-ds
  17. ports:
  18. - name: http
  19. port: 80
  20. targetPort: 80
  21. ---
  22. apiVersion: apps/v1
  23. kind: DaemonSet
  24. metadata:
  25. name: nginx-ds
  26. spec:
  27. selector:
  28. matchLabels:
  29. app: nginx-ds
  30. template:
  31. metadata:
  32. labels:
  33. app: nginx-ds
  34. spec:
  35. containers:
  36. - name: my-nginx
  37. image: nginx:1.19
  38. ports:
  39. - containerPort: 80
  40. EOF
  41.  
  42. # 创建ds
  43. $ kubectl apply -f nginx-ds.yml
  44.  
  45. ```
  46.  
  47. ## 2. 检查各种ip连通性
  48. ```bash
  49. # 检查各 Node 上的 Pod IP 连通性
  50. $ kubectl get pods -o wide
  51.  
  52. # 在每个worker节点上ping pod ip
  53. $ ping <pod-ip>
  54.  
  55. # 检查service可达性
  56. $ kubectl get svc
  57.  
  58. # 在每个worker节点上访问服务
  59. $ curl <service-ip>:<port>
  60.  
  61. # 在每个节点检查node-port可用性
  62. $ curl <node-ip>:<port>
  63. ```
  64.  
  65. ## 3. 检查dns可用性
  66. ```bash
  67. # 创建一个nginx pod
  68. $ cat > pod-nginx.yaml <<EOF
  69. apiVersion: v1
  70. kind: Pod
  71. metadata:
  72. name: nginx
  73. spec:
  74. containers:
  75. - name: nginx
  76. image: docker.io/library/nginx:1.19
  77. ports:
  78. - containerPort: 80
  79. EOF
  80.  
  81. # 创建pod
  82. $ kubectl apply -f pod-nginx.yaml
  83.  
  84. # 进入pod,查看dns
  85. $ kubectl exec nginx -it -- /bin/bash
  86.  
  87. # 查看dns配置
  88. root@nginx:/# cat /etc/resolv.conf
  89.  
  90. # 查看名字是否可以正确解析
  91. root@nginx:/# curl nginx-ds
  92. ```
  93. ## 4. 日志功能
  94. 测试使用kubectl查看pod的容器日志
  95. ```bash
  96. $ kubectl get pods
  97. $ kubectl logs <pod-name>
  98. ```
  99.  
  100. ## 5. Exec功能
  101. 测试kubectlexec功能
  102. ```bash
  103. $ kubectl get pods -l app=nginx-ds
  104. $ kubectl exec -it <nginx-pod-name> -- nginx -v
  105. ```

集群冒烟测试

k8s入坑之路(4)kubenetes安装的更多相关文章

  1. k8s入坑之路(12)ingress-nginx安装配置四层代理

    ingress官方文档地址:http://docs.kubernetes.org.cn/  https://feisky.gitbooks.io/kubernetes/content/plugins/ ...

  2. k8s入坑之路(16)kubernetes中CICD/基于宿主机jenkins

    cicd的结合组件 需要代码仓库如gitlab.github.包构建工具Maven等,持续集成工具如jenkins,github/cicd.结合自己脚本实现重复式任务自动化. 传统服务发布流程: 提交 ...

  3. k8s入坑之路(15)kubernetes共享存储与StatefulSet有状态

    共享存储 docker默认是无状态,当有状态服务时需要用到共享存储 为什么需要共享存储: 1.最常见有状态服务,本地存储有些程序会把文件保存在服务器目录中,如果容器重新启停则会丢失. 2.如果使用vo ...

  4. k8s入坑之路(13)kubernetes重要资源(namespace隔离 resources资源管理 label)

    Namespace --- 集群的共享与隔离 语言中namespace概念 namespace核心作用隔离 以上是隔离的代码.namespace隔离的是: 1.资源对象的隔离:Service.Depl ...

  5. k8s入坑之路(13)服务迁移(定时任务 微服务 传统服务)

    定时任务迁移kubernetes 服务迁移步骤 1.安装好java 2.安装好maven 项目打包 mvn package 测试传参运行 java -cp cronjob-demo-1.0-SNAPS ...

  6. k8s入坑之路(7)kubernetes设计精髓List/Watch机制和Informer模块详解

    1.list-watch是什么 List-watch 是 K8S 统一的异步消息处理机制,保证了消息的实时性,可靠性,顺序性,性能等等,为声明式风格的API 奠定了良好的基础,它是优雅的通信方式,是 ...

  7. k8s入坑之路(14)scheduler调度 kubelet管理及健康检查 更新策略

    kubelet 主要功能 Pod 管理 在 kubernetes 的设计中,最基本的管理单位是 pod,而不是 container.pod 是 kubernetes 在容器上的一层封装,由一组运行在同 ...

  8. k8s入坑之路(9)k8s网络插件详解

    Flannel: 最成熟.最简单的选择 Calico: 性能好.灵活性最强,目前的企业级主流 Canal: 将Flannel提供的网络层与Calico的网络策略功能集成在一起. Weave: 独有的功 ...

  9. k8s入坑之路(3)containerd容器

    containerd概念: containerd主要是namebases与k8s docker不同 存放路径不一致 没有默认仓库 容器运行时: 2020年未kubernetes宣布不再支持docker ...

随机推荐

  1. Groovy系列(5)- Groovy IO操作

    IO操作 Groovy为I/O操作提供了许多帮助方法,虽然你可以在Groovy中用标准Java代码来实现I/O操作,不过Groovy提供了大量的方便的方式来操作File.Stream.Reader等等 ...

  2. Linux系列(34) - yum源文件(1)

    yum源文件各参数含义 在[/etc/yum.repos.d/]目录中,默认有4个yum源文件,其中[CentOS-Linux-BaseOS.repo]是基本yum源文件,如果我们能上网,那它是默认生 ...

  3. yapi 事件创建、修改等接口事件监听

    使用的yapi作为接口文档平台.出于业务需求需要对接口创建.修改.删除等事件进行监听. yapi已经实现并预留了这个口子,但是没有找到实现的文档.这里进行简单描述下使用的方式. 一.yapi创建.修改 ...

  4. axios的简单的使用

    Axios 是什么? Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中. 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中).在服务端 ...

  5. linux 下 svn配置;以及多仓库配置

    http://www.linuxidc.com/Linux/2016-01/127679.htm https://blog.csdn.net/mrwu9902/article/details/7869 ...

  6. CF1119H-Triple【FWT】

    正题 题目链接:https://www.luogu.com.cn/problem/CF1119H 题目大意 \(n\)个可重集,第\(i\)个里有\(x\)个\(a_i\),\(y\)个\(b_i\) ...

  7. 深入浅出WPF-02.WPF系列目录

    WPF系列目录 2. XAML认识 3. XAML语法 4. x名称空间详解 5. 控件与布局 6. 绑定Binding-01 6. 绑定Binding-02 6. 绑定Binding-03 7. 属 ...

  8. MySQL表空间回收的正确姿势

    不知道大家有没有遇到这样的一种情况,线上业务在MySQL表上做增删改查操作,随着时间的推移,表里面的数据越来越多,表数据文件越来越大,数据库占用的空间自然也逐渐增长 为了缩小磁盘上表数据文件占用的空间 ...

  9. 峰值利用率80%+,视频云离线转码自研上云TKE实践

    作者 刘兆瑞,腾讯云高级研发工程师,负责腾讯明眸极速高清,画质重生等产品.专注于codec优化,画质增强等技术. 背景和问题 随着流量资费的降低和带宽的增加,视频成为人们获取信息越来越重要的方式,随之 ...

  10. Oracle基础命令操作总结

    第1章 oracle命令集 1.1 重启数据库 1.1.1 启动数据库 su -root                 切换到oracle安装用户下,我的是root source .bash_pro ...