经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Kubernetes » 查看文章
五、部署 k8s Cluster(上)
来源:cnblogs  作者:cuiyongchao007  时间:2021/1/25 10:52:02  对本文有异议

五、部署 k8s Cluster(上)

我们将部署三个节点的 Kubernetes Cluster。

? master 是 Master,node1 和 node2 是 Node。所有节点的操作系统均为 Ubuntu 18.04,当然其他 Linux 也是可以的。官方安装文档可以参考 https://kubernetes.io/docs/setup/independent/install-kubeadm/

? 注意:Kubernetes 几乎所有的安装组件和 Docker 镜像都放在 goolge 自己的网站上,这对国内的同学可能是个不小的障碍。建议是:网络障碍都必须想办法克服,不然连 Kubernetes 的门都进不了。

(一)安装 Docker

? 所有节点都需要安装 Docker。参考:https://docs.docker.com/engine/install/ubuntu/

  1. # step 1: 安装必要的一些系统工具,安装包,允许 apt 命令 HTTPS 访问 Docker 源。
  2. sudo apt-get update
  3. sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
  4. # step 2: 安装GPG证书
  5. curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
  6. # Step 3: 写入软件源信息,将 Docker 的源添加到 /etc/apt/sources.list
  7. sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
  8. # Step 4: 更新并安装Docker-CE
  9. sudo apt-get -y update &&
  10. sudo apt-get install docker-ce docker-ce-cli containerd.io

(二)安装 kubelet、kubeadm 和 kubectl

? 在所有节点上安装 kubelet、kubeadm 和 kubectl。

? kubelet 运行在 Cluster 所有节点上,负责启动 Pod 和容器。

? kubeadm 用于初始化 Cluster。

? kubectl 是 Kubernetes 命令行工具。通过 kubectl 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件。

  1. apt-get update && apt-get install -y apt-transport-https
  2. curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
  3. cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
  4. deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
  5. EOF
  6. apt-get update
  7. apt-get install -y kubelet kubeadm kubectl

(三)用 kubeadm 创建 Cluster

? 完整的官方文档可以参考 https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/

(1)初始化 Master

? 控制平面节点是运行控制平面组件的机器, 包括 etcd(集群数据库) 和 API Server(命令行工具 kubectl与之通信)。

  1. 1.(推荐)如果计划将单个控制平面 kubeadm 集群升级成高可用, 你应该指定 --control-plane-endpoint 为所有控制平面节点设置共享端点。 端点可以是负载均衡器的 DNS 名称或 IP 地址。
  2. 2.选择一个Pod网络插件,并验证是否需要为 kubeadm init 传递参数。 根据你选择的第三方网络插件,你可能需要设置 --pod-network-cidr 的值。 请参阅 安装Pod网络附加组件。
  3. 3.(可选)从版本1.14开始,kubeadm 尝试使用一系列众所周知的域套接字路径来检测 Linux 上的容器运行时。 要使用不同的容器运行时, 或者如果在预配置的节点上安装了多个容器,请为 kubeadm init 指定 --cri-socket 参数。 请参阅安装运行时。
  4. 4.(可选)除非另有说明,否则 kubeadm 使用与默认网关关联的网络接口来设置此控制平面节点 API server 的广播地址。 要使用其他网络接口,请为 kubeadm init 设置 --apiserver-advertise-address=<ip-address> 参数。 要部署使用 IPv6 地址的 Kubernetes 集群, 必须指定一个 IPv6 地址,例如 --apiserver-advertise-address=fd00::101
  5. 5.(可选)在 kubeadm init 之前运行 kubeadm config images pull,以验证与 gcr.io 容器镜像仓库的连通性。

关于 apiserver-advertise-address 和 ControlPlaneEndpoint 的注意事项:

? --apiserver-advertise-address 可用于为控制平面节点的 API server 设置广播地址, --control-plane-endpoint 可用于为所有控制平面节点设置共享端点。

? --control-plane-endpoint 允许 IP 地址和可以映射到 IP 地址的 DNS 名称。 请与你的网络管理员联系,以评估有关此类映射的可能解决方案。

? 这是一个示例映射:

  1. 192.168.0.102 cluster-endpoint

? 其中 192.168.0.102 是此节点的 IP 地址,cluster-endpoint 是映射到该 IP 的自定义 DNS 名称。 这将允许你将 --control-plane-endpoint=cluster-endpoint 传递给 kubeadm init,并将相同的 DNS 名称传递给 kubeadm join。 稍后你可以修改 cluster-endpoint 以指向高可用性方案中的负载均衡器的地址。

kubeadm 不支持将没有 --control-plane-endpoint 参数的单个控制平面集群转换为高可用性集群。

? 关闭 SELinux:

  1. # 临时禁用selinux
  2. # 永久关闭 修改/etc/sysconfig/selinux文件设置
  3. sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
  4. # 这里按回车,下面是第二条命令
  5. setenforce 0

? 在 Master 上执行如下命令:

  1. 关闭swap
  2. swapoff -a
  3. sed -ri 's/.*swap.*/#&/' /etc/fstab
  4. 所有节点,kubeadm初始化警告”cgroupfs“解决
  5. vi /lib/systemd/system/docker.service
  6. ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd
  7. systemctl daemon-reload
  8. systemctl restart docker
  9. 初始化master
  10. kubeadm init --image-repository registry.aliyuncs.com/google_containers --apiserver-advertise-address 10.0.0.41 --pod-network-cidr=10.244.0.0/16

? --apiserver-advertise-address 指明用 Master 的哪个 interface 与 Cluster 的其他节点通信。如果 Master 有多个 interface,建议明确指定,如果不指定,kubeadm 会自动选择有默认网关的 interface。

? --pod-network-cidr 指定 Pod 网络的范围。Kubernetes 支持多种网络方案,而且不同网络方案对 --pod-network-cidr 有自己的要求,这里设置为 10.244.0.0/16 是因为我们将使用 flannel 网络方案,必须设置成这个 CIDR。在后面的实践中我们会切换到其他网络方案,比如 Canal。

  1. root@cuiyongchao:~# kubeadm init --image-repository registry.aliyuncs.com/google_containers --apiserver-advertise-address 10.0.0.41 --pod-network-cidr=10.244.0.0/16
  2. W1101 09:18:28.676350 26460 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
  3. [init] Using Kubernetes version: v1.19.3
  4. [preflight] Running pre-flight checks ---①
  5. [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
  6. [preflight] Pulling images required for setting up a Kubernetes cluster
  7. [preflight] This might take a minute or two, depending on the speed of your internet connection
  8. [preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
  9. [certs] Using certificateDir folder "/etc/kubernetes/pki"
  10. [certs] Generating "ca" certificate and key ---②
  11. [certs] Generating "apiserver" certificate and key
  12. [certs] apiserver serving cert is signed for DNS names [cuiyongchao kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 10.0.0.41]
  13. [certs] Generating "apiserver-kubelet-client" certificate and key
  14. [certs] Generating "front-proxy-ca" certificate and key
  15. [certs] Generating "front-proxy-client" certificate and key
  16. [certs] Generating "etcd/ca" certificate and key
  17. [certs] Generating "etcd/server" certificate and key
  18. [certs] etcd/server serving cert is signed for DNS names [cuiyongchao localhost] and IPs [10.0.0.41 127.0.0.1 ::1]
  19. [certs] Generating "etcd/peer" certificate and key
  20. [certs] etcd/peer serving cert is signed for DNS names [cuiyongchao localhost] and IPs [10.0.0.41 127.0.0.1 ::1]
  21. [certs] Generating "etcd/healthcheck-client" certificate and key
  22. [certs] Generating "apiserver-etcd-client" certificate and key
  23. [certs] Generating "sa" key and public key
  24. [kubeconfig] Using kubeconfig folder "/etc/kubernetes"
  25. [kubeconfig] Writing "admin.conf" kubeconfig file
  26. [kubeconfig] Writing "kubelet.conf" kubeconfig file ---③
  27. [kubeconfig] Writing "controller-manager.conf" kubeconfig file
  28. [kubeconfig] Writing "scheduler.conf" kubeconfig file
  29. [kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
  30. [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
  31. [kubelet-start] Starting the kubelet
  32. [control-plane] Using manifest folder "/etc/kubernetes/manifests"
  33. [control-plane] Creating static Pod manifest for "kube-apiserver"
  34. [control-plane] Creating static Pod manifest for "kube-controller-manager"
  35. [control-plane] Creating static Pod manifest for "kube-scheduler"
  36. [etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
  37. [wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
  38. [apiclient] All control plane components are healthy after 33.004269 seconds ----④
  39. [upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
  40. [kubelet] Creating a ConfigMap "kubelet-config-1.19" in namespace kube-system with the configuration for the kubelets in the cluster
  41. [upload-certs] Skipping phase. Please see --upload-certs
  42. [mark-control-plane] Marking the node cuiyongchao as control-plane by adding the label "node-role.kubernetes.io/master=''"
  43. [mark-control-plane] Marking the node cuiyongchao as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule]
  44. [bootstrap-token] Using token: krsig9.fnxqz4724vkrlevz
  45. [bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
  46. [bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to get nodes
  47. [bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
  48. [bootstrap-token] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
  49. [bootstrap-token] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
  50. [bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
  51. [kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
  52. [addons] Applied essential addon: CoreDNS
  53. [addons] Applied essential addon: kube-proxy ---⑤
  54. Your Kubernetes control-plane has initialized successfully! ---⑥
  55. To start using your cluster, you need to run the following as a regular user:
  56. mkdir -p $HOME/.kube
  57. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config ---⑦
  58. sudo chown $(id -u):$(id -g) $HOME/.kube/config
  59. You should now deploy a pod network to the cluster.
  60. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: ---⑧
  61. https://kubernetes.io/docs/concepts/cluster-administration/addons/
  62. Then you can join any number of worker nodes by running the following on each as root:
  63. kubeadm join 10.0.0.41:6443 --token krsig9.fnxqz4724vkrlevz \ ---⑨
  64. --discovery-token-ca-cert-hash sha256:cf41916f790097ac0619a837626caefb0ff5d926ea8e5cdedf5dbc1c80292fd1
  65. root@cuiyongchao:~#

① kubeadm 执行初始化前的检查。

② 生成 token 和证书。

③ 生成 KubeConfig 文件,kubelet 需要这个文件与 Master 通信。

④ 安装 Master 组件,会从 goolge 的 Registry 下载组件的 Docker 镜像,这一步可能会花一些时间,主要取决于网络质量。

⑤ 安装附加组件 kube-proxy 和 kube-dns。

⑥ Kubernetes Master 初始化成功。

⑦ 提示如何配置 kubectl,后面会实践。

⑧ 提示如何安装 Pod 网络,后面会实践。

⑨ 提示如何注册其他节点到 Cluster,后面会实践。

(2)配置 kubectl

? kubectl 是管理 Kubernetes Cluster 的命令行工具,前面我们已经在所有的节点安装了 kubectl。Master 初始化完成后需要做一些配置工作,然后 kubectl 就能使用了。依照 kubeadm init 输出的第 ⑦ 步提示,推荐用 Linux 普通用户执行 kubectl(root 会有一些问题)。

我们为 ubuntu 用户配置 kubectl:

  1. su - ubuntu
  2. rm -rf $HOME/.kube
  3. sudo mkdir -p $HOME/.kube
  4. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  5. sudo chown $(id -u):$(id -g) $HOME/.kube/config
  6. 为了使用更便捷,启用 kubectl 命令的自动补全功能。
  7. echo "source <(kubectl completion bash)" >> ~/.bashrc
  8. 这样 ubuntu 用户就可以使用 kubectl 了。

这样 ubuntu 用户就可以使用 kubectl 了。

原文链接:http://www.cnblogs.com/cuiyongchao007/p/14305739.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号