安装方式介绍

  • minikube
    只是一个 K8S 集群模拟器,只有一个节点的集群,仅限测试使用。
  • 云平台容器服务,例如腾讯云TKE、阿里云ACK
    可视化搭建,只需简单几步就可以创建好一个集群。
    优点:安装简单,生态齐全,负载均衡器、存储等都给你配套好,简单操作就搞定
  • 裸机安装,安装方式:kubeadm、rancher、kubesphere……
    至少需要两台机器(主节点、工作节点个一台),需要自己安装 Kubernetes 组件,配置会稍微麻烦点。
    如果是测试的话可以到各云厂商按时租用服务器,费用低,用完就销毁。
    缺点:配置麻烦,缺少生态支持,例如负载均衡器、云存储。

minikube

安装非常简单,支持各种平台,安装方法

需要提前安装好 Docker

  1. # 安装kubectl,版本跟minikube安装的k8s版本一致
  2. $ curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.23.3/bin/linux/amd64/kubectl
  3. $ chmod +x kubectl
  4. $ mv kubectl /usr/local/bin/kubectl
  5. # 安装minikube
  6. $ wget https://github.com/kubernetes/minikube/releases/download/v1.25.2/minikube-1.25.2-0.x86_64.rpm
  7. $ rpm -ivh minikube-1.25.2-0.x86_64.rpm
  8. # 使用docker驱动不能使用root用户,新建minikube用户用于启动,否则添加--force参数启动
  9. $ useradd minikube
  10. $ usermod -a -G docker minikube
  11. # 切换到minikube用户进行安装
  12. $ su minikube
  13. $ minikube start --image-mirror-country='cn' --image-repository='registry.cn-hangzhou.aliyuncs.com/google_containers' --cpus 2 --memory 8192 --driver=docker
  14. * minikube v1.25.2 on Centos 7.9.2009 (kvm/amd64)
  15. * Using the docker driver based on existing profile
  16. ! Your cgroup does not allow setting memory.
  17. - More information: https://docs.docker.com/engine/install/linux-postinstall/#your-kernel-does-not-support-cgroup-swap-limit-capabilities
  18. ! Your cgroup does not allow setting memory.
  19. - More information: https://docs.docker.com/engine/install/linux-postinstall/#your-kernel-does-not-support-cgroup-swap-limit-capabilities
  20. * Starting control plane node minikube in cluster minikube
  21. * Pulling base image ...
  22. * Updating the running docker "minikube" container ...
  23. * Preparing Kubernetes v1.23.3 on containerd 1.4.12 ...
  24. - kubelet.housekeeping-interval=5m
  25. - kubelet.cni-conf-dir=/etc/cni/net.mk
  26. > kubelet.sha256: 64 B / 64 B [--------------------------] 100.00% ? p/s 0s
  27. > kubeadm.sha256: 64 B / 64 B [--------------------------] 100.00% ? p/s 0s
  28. > kubectl.sha256: 64 B / 64 B [--------------------------] 100.00% ? p/s 0s
  29. > kubectl: 44.43 MiB / 44.43 MiB [---------------] 100.00% 2.93 MiB p/s 15s
  30. > kubelet: 118.75 MiB / 118.75 MiB [-----------] 100.00% 1.22 MiB p/s 1m38s
  31. > kubeadm: 43.12 MiB / 43.12 MiB [------------] 100.00% 23.66 KiB p/s 31m6s
  32. - Generating certificates and keys ...
  33. - Booting up control plane ...
  34. - Configuring RBAC rules ...
  35. * Configuring CNI (Container Networking Interface) ...
  36. * Verifying Kubernetes components...
  37. - Using image registry.cn-hangzhou.aliyuncs.com/google_containers/storage-provisioner:v5
  38. * Enabled addons: default-storageclass, storage-provisioner
  39. * Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
  40. # 查看节点。kubectl 是一个用来跟 K8S 集群进行交互的命令行工具
  41. $ kubectl get node
  42. ### 查看信息
  43. $ minikube status
  44. $ kubectl cluster-info
  45. ### 进入到minikube
  46. $ minikube ssh
  47. $ docker ps
  48. # 安装集群可视化 Web UI 控制台
  49. $ minikube dashboard --url
  50. # 让其它 IP 可以访问控制台
  51. $ nohup kubectl proxy --port=8888 --address='0.0.0.0' --accept-hosts='^.*' &
  52. # dashboard链接
  53. # http://{node_ip}:8888/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/#/overview?namespace=default
  54. # 停止集群
  55. $ minikube stop
  56. # 清空集群
  57. $ minikube delete --all

错误处理
错误:failed to find free subnet for docker network minikube after 20 attempts
处理方式:在执行minikube start前先手动创建network

  1. $ docker network create --subnet 192.168.9.0/24 --drive bridge minikube

云平台容器服务

裸机搭建

本文介绍kubernetes官方安装方式kubeadm

主节点需要组件
  • docker(也可以是其他容器运行时)
  • kubectl 集群命令行交互工具
  • kubeadm 集群初始化工具

工作节点需要组件
  • docker(也可以是其他容器运行时)
  • kubelet 管理 Pod 和容器,确保他们健康稳定运行。
  • kube-proxy 网络代理,负责网络相关的工作

开始安装

  1. # 每个节点分别设置对应主机名
  2. $ hostnamectl set-hostname master
  3. $ hostnamectl set-hostname node1
  4. $ hostnamectl set-hostname node2
  5. # 所有节点都修改 hosts
  6. $ vim /etc/hosts
  7. 172.16.32.10 master
  8. 172.16.32.11 node1
  9. 172.16.32.12 node2
  10. # 所有节点关闭防火墙
  11. $ systemctl stop firewalld
  12. $ systemctl disable firewalld
  13. # 所有节点关闭 SELinux
  14. $ setenforce 0
  15. $ sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
  16. # 所有节点关闭 swap 分区
  17. $ swapoff -a
  18. $ sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab
  19. # 所有节点配置时区和时间同步
  20. $ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  21. $ yum install chrony -y
  22. $ vim /etc/chrony.conf
  23. server ntp1.aliyun.com iburst
  24. server ntp2.aliyun.com iburst
  25. server time1.cloud.tencent.com iburst
  26. server time2.cloud.tencent.com iburst
  27. $ systemctl enable chronyd && systemctl start chronyd
  28. # 所有节点优化内核
  29. $ cat > /etc/sysctl.d/k8s.conf << EOF
  30. net.ipv4.ip_forward = 1
  31. net.bridge.bridge-nf-call-iptables = 1
  32. net.bridge.bridge-nf-call-ip6tables = 1
  33. fs.may_detach_mounts = 1
  34. vm.overcommit_memory=1
  35. vm.panic_on_oom=0
  36. fs.inotify.max_user_watches=89100
  37. fs.file-max=52706963
  38. fs.nr_open=52706963
  39. net.ipv4.tcp_keepalive_time = 600
  40. net.ipv4.tcp.keepaliv.probes = 3
  41. net.ipv4.tcp_keepalive_intvl = 15
  42. net.ipv4.tcp.max_tw_buckets = 36000
  43. net.ipv4.tcp_tw_reuse = 1
  44. net.ipv4.tcp.max_orphans = 327680
  45. net.ipv4.tcp_orphan_retries = 3
  46. net.ipv4.tcp_syncookies = 1
  47. net.ipv4.tcp_max_syn_backlog = 16384
  48. net.ipv4.ip_conntrack_max = 65536
  49. net.ipv4.tcp_max_syn_backlog = 16384
  50. net.ipv4.top_timestamps = 0
  51. net.core.somaxconn = 16384
  52. EOF

配置免密登录(master节点)

  1. # 生成密钥对
  2. $ ssh-keygen -t rsa
  3. Generating public/private rsa key pair.
  4. Enter file in which to save the key (/root/.ssh/id_rsa):
  5. Created directory '/root/.ssh'.
  6. Enter passphrase (empty for no passphrase):
  7. Enter same passphrase again:
  8. Your identification has been saved in /root/.ssh/id_rsa.
  9. Your public key has been saved in /root/.ssh/id_rsa.pub.
  10. The key fingerprint is:
  11. SHA256:sIXgoKGkS09cs/OREa+DBSQXrX5fa2bBATPOT2YSbjc root@k8s-master01
  12. The key's randomart image is:
  13. +---[RSA 2048]----+
  14. |....oBoo. |
  15. |+o.o+.+o+= |
  16. |+. o.o++=.= |
  17. |..o .=+o* E |
  18. |. ....+S O o |
  19. | . .. = |
  20. | . . . o |
  21. | . = |
  22. | + |
  23. +----[SHA256]-----+
  24. # 分发公钥到其他节点
  25. $ ssh-copy-id -i ~/.ssh/id_rsa.pub root@node1
  26. $ ssh-copy-id -i ~/.ssh/id_rsa.pub root@node2

添加安装源(所有节点)

  1. # 添加 k8s 安装源
  2. $ cat <<EOF > /etc/yum.repos.d/kubernetes.repo
  3. [kubernetes]
  4. name=Kubernetes
  5. baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
  6. enabled=1
  7. gpgcheck=0
  8. repo_gpgcheck=0
  9. gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  10. EOF
  11. # 添加 Docker 安装源
  12. $ yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装所需组件(所有节点)
$ yum install -y kubelet-1.24.2 kubectl-1.24.2 kubeadm-1.24.2

每个版本的安装方式可能会存在差异,所以这里指定安装版本。

启动 kubelet、docker,并设置开机启动(所有节点)

  1. $ systemctl enable docker
  2. $ systemctl enable kubelet
  3. $ systemctl start docker
  4. $ systemctl start kubelet

修改 docker 配置(所有节点)

  1. # kubernetes 官方推荐 docker 等使用 systemd 作为 cgroupdriver,否则 kubelet 启动不了
  2. $ cat <<EOF > /etc/docker/daemon.json
  3. {
  4. "exec-opts": ["native.cgroupdriver=systemd"],
  5. "insecure-registries": ["registry.cn-shenzhen.aliyuncs.com"],
  6. "registry-mirrors": [
  7. "https://registry.docker-cn.com",
  8. "http://hub-mirror.c.163.com",
  9. "https://docker.mirrors.ustc.edu.cn"
  10. ]
  11. }
  12. EOF
  13. # 重启生效
  14. $ systemctl daemon-reload
  15. $ systemctl restart docker

kubeadm 初始化集群(仅在主节点跑),

  1. # 初始化集群控制台 Control plane
  2. # 失败了可以用 kubeadm reset 重置
  3. $ kubeadm init --image-repository=registry.aliyuncs.com/google_containers
  4. # 记得把 kubeadm join xxx 保存起来
  5. # 忘记了重新获取:kubeadm token create --print-join-command
  6. # 复制授权文件,以便 kubectl 可以有权限访问集群
  7. # 如果你其他节点需要访问集群,需要从主节点复制这个文件过去其他节点
  8. $ mkdir -p $HOME/.kube
  9. $ cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  10. $ chown $(id -u):$(id -g) $HOME/.kube/config
  11. # 在其他机器上创建 ~/.kube/config 文件也能通过 kubectl 访问到集群

有兴趣了解 kubeadm init 具体做了什么的,可以 查看文档

把工作节点加入集群(只在工作节点跑)

  1. $ kubeadm join 172.16.32.10:6443 --token xxx --discovery-token-ca-cert-hash xxx

安装网络插件,否则 node 是 NotReady 状态(主节点跑)

  1. # 很有可能国内网络访问不到这个资源,你可以网上找找国内的源安装 flannel
  2. $ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

查看节点,要在主节点查看(其他节点有安装 kubectl 也可以查看)
2.安装 Kubernetes 集群 - 图1