Kubernetes 二进制部署 《easzlab / kubeasz项目部署》- 04-安装master节点

本文主要是介绍Kubernetes 二进制部署 《easzlab / kubeasz项目部署》- 04-安装master节点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Kubernetes 二进制部署 《easzlab / kubeasz项目部署》

    • 04-安装master节点
      • 高可用机制
      • 安装流程
      • 创建apiserver的服务配置文件
      • 创建controller-manager 的服务文件
      • 创建scheduler 的服务文件
      • 在master 节点安装 node 服务: kubelet kube-proxy

04-安装master节点

部署master节点主要包含三个组件apiserver scheduler controller-manager,其中:

  • apiserver提供集群管理的REST API接口,包括认证授权、数据校验以及集群状态变更等

      只有API Server才直接操作etcd其他模块通过API Server查询或修改数据提供其他模块之间的数据交互和通信的枢纽
    
  • scheduler负责分配调度Pod到集群内的node节点

      监听kube-apiserver,查询还未分配Node的Pod根据调度策略为这些Pod分配节点
    
  • controller-manager由一系列的控制器组成,它通过apiserver监控整个集群的状态,并确保集群处于预期的工作状态

高可用机制

  • apiserver 无状态服务,可以通过外部负载均衡实现高可用,如项目采用的两种高可用架构:HA-1x (#584)HA-2x (#585)
  • controller-manager 组件启动时会进行类似选举(leader);当多副本存在时,如果原先leader挂掉,那么会选举出新的leader,从而保证高可用;
  • scheduler 类似选举机制

安装流程

cat playbooks/04.kube-master.yml
- hosts: kube_masterroles:- kube-lb        # 四层负载均衡,监听在127.0.0.1:6443,转发到真实master节点apiserver服务- kube-master    #- kube-node      # 因为网络、监控等daemonset组件,master节点也推荐安装kubelet和kube-proxy服务... 

kubernetes apiserver 使用对等证书,创建时hosts字段需要配置:

如果配置 ex_lb,需要把 EX_APISERVER_VIP 也配置进去
如果需要外部访问 apiserver,可选在config.yml配置 MASTER_CERT_HOSTS
kubectl get svc 将看到集群中由api-server 创建的默认服务 kubernetes,因此也要把 kubernetes 服务名和各个服务域名也添加进去
[root@k8s-master-01 kubeasz]# cat roles/kube-master/tasks/main.yml
- name: 下载 kube_master 二进制copy: src={{ base_dir }}/bin/{{ item }} dest={{ bin_dir }}/{{ item }} mode=0755with_items:- kube-apiserver- kube-controller-manager- kube-scheduler- kubectltags: upgrade_k8s- name: 分发controller/scheduler kubeconfig配置文件copy: src={{ cluster_dir }}/{{ item }} dest=/etc/kubernetes/{{ item }}with_items:- kube-controller-manager.kubeconfig- kube-scheduler.kubeconfigtags: force_change_certs- name: 创建 kubernetes 证书签名请求template: src=kubernetes-csr.json.j2 dest={{ cluster_dir }}/ssl/kubernetes-csr.jsontags: change_cert, force_change_certsconnection: local- name: 创建 kubernetes 证书和私钥shell: "cd {{ cluster_dir }}/ssl && {{ base_dir }}/bin/cfssl gencert \-ca=ca.pem \-ca-key=ca-key.pem \-config=ca-config.json \-profile=kubernetes kubernetes-csr.json | {{ base_dir }}/bin/cfssljson -bare kubernetes"tags: change_cert, force_change_certsconnection: local# 创建aggregator proxy相关证书
- name: 创建 aggregator proxy证书签名请求template: src=aggregator-proxy-csr.json.j2 dest={{ cluster_dir }}/ssl/aggregator-proxy-csr.jsonconnection: localtags: force_change_certs- name: 创建 aggregator-proxy证书和私钥shell: "cd {{ cluster_dir }}/ssl && {{ base_dir }}/bin/cfssl gencert \-ca=ca.pem \-ca-key=ca-key.pem \-config=ca-config.json \-profile=kubernetes aggregator-proxy-csr.json | {{ base_dir }}/bin/cfssljson -bare aggregator-proxy"connection: localtags: force_change_certs- name: 分发 kubernetes证书copy: src={{ cluster_dir }}/ssl/{{ item }} dest={{ ca_dir }}/{{ item }}with_items:- ca.pem- ca-key.pem- kubernetes.pem- kubernetes-key.pem- aggregator-proxy.pem- aggregator-proxy-key.pemtags: change_cert, force_change_certs#clusters/k8s-cluster-01/hosts:SECURE_PORT="6443"
- name: 替换 kubeconfig 的 apiserver 地址lineinfile:dest: "{{ item }}"regexp: "^    server"line: "    server: https://127.0.0.1:{{ SECURE_PORT }}"with_items:- "/etc/kubernetes/kube-controller-manager.kubeconfig"- "/etc/kubernetes/kube-scheduler.kubeconfig"tags: force_change_certs- name: 创建 master 服务的 systemd unit 文件template: src={{ item }}.j2 dest=/etc/systemd/system/{{ item }}with_items:- kube-apiserver.service- kube-controller-manager.service- kube-scheduler.servicetags: restart_master, upgrade_k8s- name: enable master 服务shell: systemctl enable kube-apiserver kube-controller-manager kube-schedulerignore_errors: true- name: 启动 master 服务shell: "systemctl daemon-reload && systemctl restart kube-apiserver && \systemctl restart kube-controller-manager && systemctl restart kube-scheduler"tags: upgrade_k8s, restart_master, force_change_certs# 轮询等待kube-apiserver启动完成
- name: 轮询等待kube-apiserver启动shell: "systemctl is-active kube-apiserver.service"register: api_statusuntil: '"active" in api_status.stdout'retries: 10delay: 3tags: upgrade_k8s, restart_master, force_change_certs# 轮询等待kube-controller-manager启动完成
- name: 轮询等待kube-controller-manager启动shell: "systemctl is-active kube-controller-manager.service"register: cm_statusuntil: '"active" in cm_status.stdout'retries: 8delay: 3tags: upgrade_k8s, restart_master, force_change_certs# 轮询等待kube-scheduler启动完成
- name: 轮询等待kube-scheduler启动shell: "systemctl is-active kube-scheduler.service"register: sch_statusuntil: '"active" in sch_status.stdout'retries: 8delay: 3tags: upgrade_k8s, restart_master, force_change_certs- block:- name: 复制kubectl.kubeconfigshell: 'cd {{ cluster_dir }} && cp -f kubectl.kubeconfig {{ K8S_NODENAME }}-kubectl.kubeconfig'tags: upgrade_k8s, restart_master, force_change_certs- name: 替换 kubeconfig 的 apiserver 地址lineinfile:dest: "{{ cluster_dir }}/{{ K8S_NODENAME }}-kubectl.kubeconfig"regexp: "^    server"line: "    server: https://{{ inventory_hostname }}:{{ SECURE_PORT }}"tags: upgrade_k8s, restart_master, force_change_certs- name: 轮询等待master服务启动完成command: "{{ base_dir }}/bin/kubectl --kubeconfig={{ cluster_dir }}/{{ K8S_NODENAME }}-kubectl.kubeconfig get node"register: resultuntil:    result.rc == 0retries:  5delay: 6tags: upgrade_k8s, restart_master, force_change_certs- name: 获取user:kubernetes是否已经绑定对应角色shell: "{{ base_dir }}/bin/kubectl get clusterrolebindings|grep kubernetes-crb || echo 'notfound'"register: crb_inforun_once: true- name: 创建user:kubernetes角色绑定command: "{{ base_dir }}/bin/kubectl create clusterrolebinding kubernetes-crb --clusterrole=system:kubelet-api-admin --user=kubernetes"run_once: truewhen: "'notfound' in crb_info.stdout"connection: local

创建apiserver的服务配置文件

[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target[Service]
ExecStart={{ bin_dir }}/kube-apiserver \--allow-privileged=true \--anonymous-auth=false \--api-audiences=api,istio-ca \--authorization-mode=Node,RBAC \--bind-address={{ inventory_hostname }} \--client-ca-file={{ ca_dir }}/ca.pem \--endpoint-reconciler-type=lease \--etcd-cafile={{ ca_dir }}/ca.pem \--etcd-certfile={{ ca_dir }}/kubernetes.pem \--etcd-keyfile={{ ca_dir }}/kubernetes-key.pem \--etcd-servers={{ ETCD_ENDPOINTS }} \--kubelet-certificate-authority={{ ca_dir }}/ca.pem \--kubelet-client-certificate={{ ca_dir }}/kubernetes.pem \--kubelet-client-key={{ ca_dir }}/kubernetes-key.pem \--secure-port={{ SECURE_PORT }} \--service-account-issuer=https://kubernetes.default.svc \--service-account-signing-key-file={{ ca_dir }}/ca-key.pem \--service-account-key-file={{ ca_dir }}/ca.pem \--service-cluster-ip-range={{ SERVICE_CIDR }} \--service-node-port-range={{ NODE_PORT_RANGE }} \--tls-cert-file={{ ca_dir }}/kubernetes.pem \--tls-private-key-file={{ ca_dir }}/kubernetes-key.pem \--requestheader-client-ca-file={{ ca_dir }}/ca.pem \--requestheader-allowed-names= \--requestheader-extra-headers-prefix=X-Remote-Extra- \--requestheader-group-headers=X-Remote-Group \--requestheader-username-headers=X-Remote-User \--proxy-client-cert-file={{ ca_dir }}/aggregator-proxy.pem \--proxy-client-key-file={{ ca_dir }}/aggregator-proxy-key.pem \--enable-aggregator-routing=true \--v=2
Restart=always
RestartSec=5
Type=notify
LimitNOFILE=65536[Install]
WantedBy=multi-user.target
  • Kubernetes 对 API 访问需要依次经过认证、授权和准入控制(admission controll),认证解决用户是谁的问题,授权解决用户能做什么的问题,Admission Control则是资源管理方面的作用。
  • 关于authorization-mode=Node,RBAC v1.7+支持Node授权,配合NodeRestriction准入控制来限制kubelet仅可访问node、endpoint、pod、service以及secret、configmap、PV和PVC等相关的资源;需要注意的是v1.7中Node 授权是默认开启的,v1.8中需要显式配置开启,否则 Node无法正常工作
  • 详细参数配置请参考kube-apiserver --help,关于认证、授权和准入控制请阅读
  • 增加了访问kubelet使用的证书配置,防止匿名访问kubelet的安全漏洞

创建controller-manager 的服务文件

[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/GoogleCloudPlatform/kubernetes[Service]
ExecStart={{ bin_dir }}/kube-controller-manager \--allocate-node-cidrs=true \--authentication-kubeconfig=/etc/kubernetes/kube-controller-manager.kubeconfig \--authorization-kubeconfig=/etc/kubernetes/kube-controller-manager.kubeconfig \--bind-address=0.0.0.0 \--cluster-cidr={{ CLUSTER_CIDR }} \--cluster-name=kubernetes \--cluster-signing-cert-file={{ ca_dir }}/ca.pem \--cluster-signing-key-file={{ ca_dir }}/ca-key.pem \--kubeconfig=/etc/kubernetes/kube-controller-manager.kubeconfig \--leader-elect=true \--node-cidr-mask-size={{ NODE_CIDR_LEN }} \--root-ca-file={{ ca_dir }}/ca.pem \--service-account-private-key-file={{ ca_dir }}/ca-key.pem \--service-cluster-ip-range={{ SERVICE_CIDR }} \--use-service-account-credentials=true \--v=2
Restart=always
RestartSec=5[Install]
WantedBy=multi-user.target
  • --cluster-cidr 指定 Cluster 中 Pod 的 CIDR 范围,该网段在各 Node 间必须路由可达(flannel/calico 等网络插件实现)
  • --service-cluster-ip-range 参数指定 Cluster 中 Service 的CIDR范围,必须和 kube-apiserver 中的参数一致
  • --cluster-signing-* 指定的证书和私钥文件用来签名为 TLS BootStrap 创建的证书和私钥
  • --root-ca-file 用来对 kube-apiserver 证书进行校验,指定该参数后,才会在Pod 容器的 ServiceAccount 中放置该 CA 证书文件
  • --leader-elect=true 使用多节点选主的方式选择主节点。只有主节点才会启动所有控制器,而其他从节点则仅执行选主算法

创建scheduler 的服务文件

[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/GoogleCloudPlatform/kubernetes[Service]
ExecStart={{ bin_dir }}/kube-scheduler \--authentication-kubeconfig=/etc/kubernetes/kube-scheduler.kubeconfig \--authorization-kubeconfig=/etc/kubernetes/kube-scheduler.kubeconfig \--bind-address=0.0.0.0 \--kubeconfig=/etc/kubernetes/kube-scheduler.kubeconfig \--leader-elect=true \--v=2
Restart=always
RestartSec=5[Install]
WantedBy=multi-user.target

--leader-elect=true 部署多台机器组成的 master 集群时,选举产生一个处于工作状态的 kube-controller-manager 进程

在master 节点安装 node 服务: kubelet kube-proxy

项目master 分支使用 DaemonSet 方式安装网络插件,如果master 节点不安装 kubelet 服务是无法安装网络插件的,如果 master 节点不安装网络插件,那么通过apiserver 方式无法访问 dashboard kibana等管理界面

在master 节点也同时成为 node 节点后,默认业务 POD也会调度到 master节点;可以使用 kubectl cordon命令禁止业务 POD调度到 master节点。

[root@k8s-master-01 kubeasz]# kubectl get componentstatus
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE   ERROR
scheduler            Healthy   ok
controller-manager   Healthy   ok
etcd-0               Healthy   ok

这篇关于Kubernetes 二进制部署 《easzlab / kubeasz项目部署》- 04-安装master节点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/784869

相关文章

IDEA运行spring项目时,控制台未出现的解决方案

《IDEA运行spring项目时,控制台未出现的解决方案》文章总结了在使用IDEA运行代码时,控制台未出现的问题和解决方案,问题可能是由于点击图标或重启IDEA后控制台仍未显示,解决方案提供了解决方法... 目录问题分析解决方案总结问题js使用IDEA,点击运行按钮,运行结束,但控制台未出现http://

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

SpringBoot项目中Maven剔除无用Jar引用的最佳实践

《SpringBoot项目中Maven剔除无用Jar引用的最佳实践》在SpringBoot项目开发中,Maven是最常用的构建工具之一,通过Maven,我们可以轻松地管理项目所需的依赖,而,... 目录1、引言2、Maven 依赖管理的基础概念2.1 什么是 Maven 依赖2.2 Maven 的依赖传递机

Vue项目中Element UI组件未注册的问题原因及解决方法

《Vue项目中ElementUI组件未注册的问题原因及解决方法》在Vue项目中使用ElementUI组件库时,开发者可能会遇到一些常见问题,例如组件未正确注册导致的警告或错误,本文将详细探讨这些问题... 目录引言一、问题背景1.1 错误信息分析1.2 问题原因二、解决方法2.1 全局引入 Element

Kubernetes常用命令大全近期总结

《Kubernetes常用命令大全近期总结》Kubernetes是用于大规模部署和管理这些容器的开源软件-在希腊语中,这个词还有“舵手”或“飞行员”的意思,使用Kubernetes(有时被称为“... 目录前言Kubernetes 的工作原理为什么要使用 Kubernetes?Kubernetes常用命令总

python管理工具之conda安装部署及使用详解

《python管理工具之conda安装部署及使用详解》这篇文章详细介绍了如何安装和使用conda来管理Python环境,它涵盖了从安装部署、镜像源配置到具体的conda使用方法,包括创建、激活、安装包... 目录pytpshheraerUhon管理工具:conda部署+使用一、安装部署1、 下载2、 安装3

龙蜥操作系统Anolis OS-23.x安装配置图解教程(保姆级)

《龙蜥操作系统AnolisOS-23.x安装配置图解教程(保姆级)》:本文主要介绍了安装和配置AnolisOS23.2系统,包括分区、软件选择、设置root密码、网络配置、主机名设置和禁用SELinux的步骤,详细内容请阅读本文,希望能对你有所帮助... ‌AnolisOS‌是由阿里云推出的开源操作系统,旨

k8s部署MongDB全过程

《k8s部署MongDB全过程》文章介绍了如何在Kubernetes集群中部署MongoDB,包括环境准备、创建Secret、创建服务和Deployment,并通过Robo3T工具测试连接... 目录一、环境准备1.1 环境说明1.2 创建 namespace1.3 创建mongdb账号/密码二、创建Sec

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j