1 硬件要求

1.1 测试环境

  • master:2核 4G 20G
  • master:4核 8G 40G

1.2 生产环境

配置要求更高

2 搭建方式

  • kubeadm:部署工具,提供kubeadm initkubeadm join,用于快速部署k8s集群
    • 门槛低,屏蔽了很多细节,遇到问题很难排查
  • 二进制包:下载发行包,手动部署每个组件,组成k8s集群。
    • 手动部署,过程麻烦,但是利于后期维护

3 kubeadm方式搭建(推荐)

  1. // 1 对所有服务器进行初始化操作
  2. // 1.1 关闭防火墙
  3. sys
  4. // 注意,必须开放的端口6443 10250
  5. firewall-cmd --zone=public --add-port=6443/tcp --permanent
  6. firewall-cmd --zone=public --add-port=10250/tcp --permanent
  7. // 1.2 关闭selinux
  8. // 1.3 关闭swap分区
  9. // 1.4 设置主机名称
  10. hostnamectl set-hostname 主机名
  11. // 1.5 在master添加host
  12. vim /etv/hosts
  13. ip1 主机名1
  14. ip2 主机名2
  15. ip3 主机名3
  16. // 1.6 将桥接的ipv4流量拆改地道iptables的链
  17. // 1.7 时间同步(更新到最新)
  18. // 2 安装docker
  19. // 3 安装kubeadm,kubelet,kubectl
  20. // 3.1 设置yum源 vim /
  21. [kubernetes]
  22. name=Kubernetes
  23. baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
  24. enabled=1
  25. gpgcheck=1
  26. repo_gpgcheck=1
  27. gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
  28. https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  29. // 3.2 安装kubelet
  30. yum install -y kubelet
  31. // 3.3 安装kubeadm
  32. yum install -y kubeadm
  33. // 3.4 安装kubectl
  34. yum install -y kubectl
  35. // 4 部署master节点
  36. // 4.1 在master节点执行
  37. kubeadm init \
  38. --apiserver-advertise-address=本机ip \
  39. --image-repository registry.aliyuncs.com/google_containers \
  40. --kubernetes-version v1.23.1(当前版本) \
  41. --service-cidr=10.96.0.0/12 \
  42. --pod-network-cidr=10.244.0.0/16
  43. // 4.2 查看nodes
  44. kubectl get nodes
  45. // 5 加入node节点
  46. // 5.1 在node节点执行
  47. kubeadm join 节点ip \
  48. --token=[token] \
  49. --discovery-token-ca-cert-hash [hash值]
  50. // 5.2 查看nodes
  51. kubectl get nodes
  52. // 6 配置CNI网络插件
  53. // 7 最后测试检验集群部署的正确性

4 kubectl方式手动搭建(重要)

4.1 所有机器进行初始化操作

  1. // 1 关闭防火墙 --可以不关
  2. // 1.1 临时关闭
  3. systemctl stop firewall
  4. // 1.2 永久关闭
  5. systemctl disable firewall
  6. // 1.3 注意,必须开放的端口2379
  7. firewall-cmd --zone=public --add-port=2379/tcp --permanent
  8. firewall-cmd --reload
  9. // 2 关闭selinux --可以不关
  10. // 2.1 临时关闭
  11. setenforce 0
  12. // 2.2 永久关闭
  13. // sed 直接对文本文件进行操作 sed -i 's/原字符串/新字符串' 目标文件
  14. sed -i 's/enforcing/disabled' /etc/selinux/config
  15. // 3 关闭swap分区 --必须
  16. // 3.1 临时关闭
  17. swapoff -a
  18. // 3.2 永久关闭
  19. // sed 直接对文本文件进行操作 sed -i 's/原字符串/新字符串' 目标文件
  20. sed -ri 's/.*swap.*/#&/' /etc/fstab
  21. // 4 修改hostname
  22. // 4.1 设置hostname
  23. hostnamectl set-hostname 主机名
  24. // 4.2 查询hostname
  25. hostname
  26. // 5 修改host
  27. vim /etc/hosts;
  28. // 5.1 添加如下内容
  29. 192.168.203.166 master
  30. 192.168.203.167 node-167
  31. 192.168.203.168 node-168
  32. // 5.2 相互ping,测试是否设置成功
  33. // 6 将桥接的IPv4流量传递到iptables的链 ****本次学习未设置****
  34. vim /etc/sysctl.d/k8s.conf;
  35. // 6.1 添加如下内容
  36. net.bridge.bridge-nf-call-ip6tables = 1
  37. net.bridge.bridge-nf-call-iptables = 1
  38. // 6.2 使其生效
  39. sysctl --system

4.2 部署etcd集群

4.2.1 准备cfssl证书生成工具

  1. wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/local/bin/cfssl
  2. wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O /usr/local/bin/cfssljson
  3. wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -O /usr/local/bin/cfssl-certinfo
  4. chmod +x /usr/local/bin/cfssl*

4.2.2 生成Etcd证书

  1. // 1 创建CA配置文件ca-config.json
  2. vim /opt/ssl/k8sca/ca-config.json
  3. {
  4. "signing": {
  5. "default": {
  6. "expiry": "87600h"
  7. },
  8. "profiles": {
  9. "www": {
  10. "usages": [
  11. "signing",
  12. "key encipherment",
  13. "server auth",
  14. "client auth"
  15. ],
  16. "expiry": "87600h"
  17. }
  18. }
  19. }
  20. }
  21. // 2 创建CA证书签名请求ca-csr.json
  22. vim /opt/ssl/k8sca/ca-csr.json
  23. {
  24. "CN": "etcd CA",
  25. "key": {
  26. "algo": "rsa",
  27. "size": 2048
  28. },
  29. "names": [{
  30. "C": "CN",
  31. "L": "GuangDong",
  32. "ST": "ShenZhen"
  33. }]
  34. }
  35. // 3 生成ca证书和私钥(生成ca.csr、ca-key.pem、ca.pem)
  36. cfssl gencert -initca ca-csr.json | cfssljson -bare ca
  37. // 4 创建etcd证书申请文件server-csr.json
  38. {
  39. "CN": "etcd",
  40. "hosts": [
  41. "192.168.203.166",
  42. "192.168.203.167",
  43. "192.168.203.168"
  44. ],
  45. "key": {
  46. "algo": "rsa",
  47. "size": 2048
  48. },
  49. "names": [{
  50. "C": "CN",
  51. "L": "GuangDong",
  52. "ST": "ShenZhen"
  53. }]
  54. }
  55. // 5 使用自签CA生成etcd 的https证书和私钥
  56. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server

4.2.3 部署etcd集群

  1. // master主机
  2. // 1 下载etcd
  3. wget https://storage.googleapis.com/etcd/v3.5.1/etcd-v3.5.1-linux-amd64.tar.gz
  4. // 2 解压安装etcd
  5. tar xzvf ./etcd-v3.5.1-linux-amd64.tar.gz -C ./etcd --strip-components=1
  6. // 3 创建软链接
  7. ln -s ./etcd /usr/local/bin/etcd
  8. ln -s ./etcdctl /usr/local/bin/etcdctl
  9. // 4 验证安装
  10. etcd --version
  11. // 5 设置配置文件etcd.conf
  12. vim /usr/local/etcd/etcd.conf
  13. #[Member]
  14. # 节点名称,集群中唯一
  15. ETCD_NAME="etcd-1"
  16. # 数据目录
  17. ETCD_DATA_DIR="/usr/local/etcd/default.etcd"
  18. # 集群通信监听地址
  19. ETCD_LISTEN_PEER_URLS="https://192.168.203.166:2380"
  20. # 客户端访问监听地址
  21. ETCD_LISTEN_CLIENT_URLS="https://192.168.203.166:2379"
  22. #[Clustering]
  23. # 集群通告地址
  24. ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.203.166:2380"
  25. # 客户端通告地址
  26. ETCD_ADVERTISE_CLIENT_URLS="https://192.168.203.166:2379"
  27. # 集群节点地址
  28. ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.203.166:2380,etcd-2=https://192.168.203.167:2380,etcd-3=https://192.168.203.168:2380"
  29. # 集群 Token
  30. ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
  31. # 加入集群的当前状态,new 是新集群,existing 表示加入 已有集群
  32. ETCD_INITIAL_CLUSTER_STATE="new"
  33. // 6 设置服务etcd.service
  34. vim /usr/lib/systemd/system/etcd.service
  35. [Unit]
  36. Description=Etcd Server
  37. After=network.target
  38. After=network-online.target
  39. Wants=network-online.target
  40. [Service]
  41. Type=notify
  42. EnvironmentFile=/usr/local/etcd/etcd.conf
  43. ExecStart=etcd \
  44. # 证书配置
  45. --cert-file=/opt/ssl/etcd/server.pem \
  46. --key-file=/opt/ssl/etcd/server-key.pem \
  47. --peer-cert-file=/opt/ssl/etcd/server.pem \
  48. --peer-key-file=/opt/ssl/etcd/server-key.pem \
  49. --trusted-ca-file=/opt/ssl/etcd/ca.pem \
  50. --peer-trusted-ca-file=/opt/ssl/etcd/ca.pem \
  51. --logger=zap
  52. Restart=on-failure
  53. LimitNOFILE=65536
  54. [Install]
  55. WantedBy=multi-user.target
  56. // 7 拷贝上一步生成的证书到指定目录
  57. cp /opt/ssl/k8sca/{ca,server,server-key}.pem /opt/ssl/etcd/
  58. // 8 启动并设置开机启动
  59. systemctl daemon-reload
  60. systemctl start etcd
  61. systemctl enable etcd

4.2.4 部署etcd集群

  1. // 1 将上面节点 1 所有生成的文件拷贝到其他节点
  2. scp -r /usr/loca/etcd/ root@其他节点IP:/usr/local/
  3. scp /usr/lib/systemd/system/etcd.service root@192.168.31.72:/usr/lib/systemd/system/
  4. // 2 然后在节点 2 和节点 3 分别修改 etcd.conf 配置文件中的节点名称和当前服务器 IP
  5. ETCD_NAME="etcd-1" # 修改此处,节点 2 改为 etcd-2,节点 3 改为 etcd-3
  6. ETCD_LISTEN_PEER_URLS="https://192.168.31.71:2380" # 修改此处为当前服务器 IP
  7. ETCD_LISTEN_CLIENT_URLS="https://192.168.31.71:2379" # 修改此处为当前服务器 IP
  8. ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.31.71:2380" # 修改此处为当前 服务器 IP
  9. ETCD_ADVERTISE_CLIENT_URLS="https://192.168.31.71:2379" # 修改此处为当前服务器 IP
  10. // 3 最后启动 etcd 并设置开机启动,同上。
  11. // 4 查看集群状态
  12. ETCDCTL_API=3 etcdctl \
  13. --cacert=/opt/ssl/etcd/ca.pem \
  14. --cert=/opt/ssl/etcd/server.pem \
  15. --key=/opt/ssl/etcd/server-key.pem \
  16. --endpoints="https://192.168.203.166:2379,https://192.168.203.167:2379,https://192.168.203.168:2379" \
  17. endpoint health

4.3 部署Master Node

主要工作:

  1. 部署API server
  2. 部署scheduler
  3. 部署controller-manager

4.3.1 为apiserver自签证书

  1. // 1 创建CA配置文件ca-config.json
  2. vim /opt/ssl/k8s/ca-config.json
  3. {
  4. "signing": {
  5. "default": {
  6. "expiry": "87600h"
  7. },
  8. "profiles": {
  9. "www": {
  10. "usages": [
  11. "signing",
  12. "key encipherment",
  13. "server auth",
  14. "client auth"
  15. ],
  16. "expiry": "87600h"
  17. }
  18. }
  19. }
  20. }
  21. // 2 创建CA证书签名请求ca-csr.json
  22. vim /opt/ssl/k8s/ca-csr.json
  23. {
  24. "CN": "kubernetes",
  25. "key": {
  26. "algo": "rsa",
  27. "size": 2048
  28. },
  29. "names": [{
  30. "C": "CN",
  31. "L": "GuangDong",
  32. "ST": "ShenZhen",
  33. "O": "k8s",
  34. "OU": "System"
  35. }]
  36. }
  37. // 3 生成ca证书和私钥
  38. cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
  39. // 4 创建kubernetes证书申请文件kubernetes-csr.json
  40. // 注意:可信任ip列表在此处添加hosts
  41. vim /opt/ssl/k8s/kubernetes-csr.json
  42. {
  43. "CN": "kubernetes",
  44. "hosts": [
  45. "10.0.0.1",
  46. "127.0.0.1",
  47. "kubernetes",
  48. "kubernetes.default",
  49. "kubernetes.default.svc",
  50. "kubernetes.default.svc.cluster",
  51. "kubernetes.default.svc.cluster.local",
  52. "192.168.203.166",
  53. "192.168.203.167",
  54. "192.168.203.168",
  55. "192.168.203.2"
  56. ],
  57. "key": { "algo": "rsa", "size": 2048 },
  58. "names": [
  59. { "C": "CN", "L": "GuangDong", "ST": "ShenZhen", "O": "k8s", "OU": "System" }
  60. ]
  61. }
  62. // 5 使用自签CA生成etcd 的https证书和私钥
  63. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www kubernetes-csr.json | cfssljson -bare server


4.3.2 部署 kube-apiserver

  1. // 1 下载kubernetes-server二进制包(下载地址在本文最下端)
  2. // 注意:此教程不支持1.19以上的版本
  3. tar zxvf kubernetes-server-linux-amd64.tar.gz
  4. cp ./kubernetes/server/bin/{kube-apiserver,kube-scheduler,kube-controller-manager} /usr/local/bin
  5. // 2 部署 kube-apiserver
  6. // 2.1 创建配置文件
  7. vim /opt/kubernetes/kube-apiserver.conf
  8. KUBE_APISERVER_OPTS="--logtostderr=false \\
  9. --v=2 \\
  10. --log-dir=/opt/kubernetes/logs \\
  11. --etcd-servers=https://192.168.203.166:2379,https://192.168.203.167:2379,https://192.168.203.168:2379 \\
  12. --bind-address=192.168.203.166 \\
  13. --secure-port=6443 \\
  14. --advertise-address=192.168.203.166 \\
  15. --allow-privileged=true \\
  16. --service-cluster-ip-range=10.0.0.0/24 \\
  17. --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction \\
  18. --authorization-mode=RBAC,Node \\
  19. --enable-bootstrap-token-auth=true \\
  20. --token-auth-file=/opt/kubernetes/cfg/token.csv \\
  21. --service-node-port-range=30000-32767 \\
  22. --kubelet-client-certificate=/opt/ssl/k8s/server.pem \\
  23. --kubelet-client-key=/opt/ssl/k8s/server-key.pem \\
  24. --tls-cert-file=/opt/ssl/k8s/server.pem \\
  25. --tls-private-key-file=/opt/ssl/k8s/server-key.pem \\
  26. --client-ca-file=/opt/ssl/k8s/ca.pem \\
  27. --service-account-key-file=/opt/ssl/k8s/ca-key.pem \\
  28. --etcd-cafile=/opt/ssl/etcd/ca.pem \\
  29. --etcd-certfile=/opt/ssl/etcd/server.pem \\
  30. --etcd-keyfile=/opt/ssl/etcd/server-key.pem \\
  31. --audit-log-maxage=30 \\
  32. --audit-log-maxbackup=3 \\
  33. --audit-log-maxsize=100 \\
  34. --audit-log-path=/opt/kubernetes/logs/k8s-audit.log"
  35. // 2.2 启用 TLS Bootstrapping 机制
  36. vim /opt/kubernetes/cfg/token.csv
  37. c47ffb939f5ca36231d9e3121a252940,kubelet-bootstrap,10001,"system:node- bootstrapper"
  38. // 3 systemd 管理 apiserver
  39. vim /usr/lib/systemd/system/kube-apiserver.service
  40. [Unit]
  41. Description=Kubernetes API Server
  42. Documentation=https://github.com/kubernetes/kubernetes
  43. [Service]
  44. EnvironmentFile=/opt/kubernetes/cfg/kube-apiserver.conf
  45. ExecStart=kube-apiserver $KUBE_APISERVER_OPTS
  46. Restart=on-failure
  47. [Install]
  48. WantedBy=multi-user.target
  49. // 4 启动并设置开机启动
  50. systemctl daemon-reload
  51. systemctl start kube-apiserver
  52. systemctl enable kube-apiserver
  53. systemctl status kube-apiserver
  54. // 查错
  55. cat /var/log/messages|grep kube-apiserver
  56. // 5 授权 kubelet-bootstrap 用户允许请求证书
  57. kubectl create clusterrolebinding kubelet-bootstrap \
  58. --clusterrole=system:node-bootstrapper \
  59. --user=kubelet-bootstrap

4.3.3 部署 kube-controller-manager

  1. // 1 创建配置文件
  2. vim /opt/kubernetes/kube-controller-manager.conf
  3. KUBE_CONTROLLER_MANAGER_OPTS="--logtostderr=false \\
  4. --v=2 \\
  5. --log-dir=/opt/kubernetes/logs \\
  6. --leader-elect=true \\
  7. --master=127.0.0.1:8080 \\
  8. --bind-address=127.0.0.1 \\
  9. --allocate-node-cidrs=true \\
  10. --cluster-cidr=10.244.0.0/16 \\
  11. --service-cluster-ip-range=10.0.0.0/24 \\
  12. --cluster-signing-cert-file=/opt/ssl/kubernetes/ca.pem \\
  13. --cluster-signing-key-file=/opt/ssl/kubernetes/ca-key.pem \\
  14. --root-ca-file=/opt/ssl/kubernetes/ca.pem \\
  15. --service-account-private-key-file=/opt/ssl/kubernetes/ca-key.pem \\
  16. --experimental-cluster-signing-duration=87600h0m0s"
  17. // 2 systemd 管理kube-controller-manager
  18. vim /usr/lib/systemd/system/kube-controller-manager.service
  19. [Unit]
  20. Description=Kubernetes Controller Manager
  21. Documentation=https://github.com/kubernetes/kubernetes
  22. [Service]
  23. EnvironmentFile=/opt/kubernetes/cfg/kube-controller-manager.conf
  24. ExecStart=kube-controller-manager $KUBE_CONTROLLER_MANAGER_OPTS
  25. Restart=on-failure
  26. [Install]
  27. WantedBy=multi-user.target
  28. // 3 启动并设置开机启动
  29. systemctl daemon-reload
  30. systemctl start kube-controller-manager
  31. systemctl enable kube-controller-manager
  32. systemctl status kube-controller-manager

4.3.4 部署 kube-scheduler

  1. // 1 创建配置文件
  2. vim /opt/kubernetes/kube-scheduler.conf
  3. KUBE_SCHEDULER_OPTS="--logtostderr=false \\
  4. --v=2 \\
  5. --log-dir=/opt/kubernetes/logs \\
  6. --leader-elect \\
  7. --master=127.0.0.1:8080 \\
  8. --bind-address=127.0.0.1"
  9. // 2 systemd 管理kube-scheduler
  10. vim /usr/lib/systemd/system/kube-scheduler.service
  11. [Unit]
  12. Description=Kubernetes Controller Manager
  13. Documentation=https://github.com/kubernetes/kubernetes
  14. [Service]
  15. EnvironmentFile=/opt/kubernetes/cfg/kube-scheduler.conf
  16. ExecStart=kube-scheduler $KUBE_SCHEDULER_OPTS
  17. Restart=on-failure
  18. [Install]
  19. WantedBy=multi-user.target
  20. // 3 启动并设置开机启动
  21. systemctl daemon-reload
  22. systemctl start kube-scheduler.service
  23. systemctl enable kube-scheduler.service
  24. systemctl status kube-scheduler.service

4.3.5 查看集群状态

  1. kubectl get cs

4.4 部署Worker Node

主要工作:

  1. 部署kubelet
  2. 部署kube-proxy

4.4.1 部署 kubelet

  1. // 1 创建配置文件
  2. vim /opt/kubernetes/cfg/kubelet.conf
  3. # –hostname-override:显示名称,集群中唯一
  4. # –network-plugin:启用 CNI –kubeconfig:空路径,会自动生成,后面用于连接 apiserver
  5. # –bootstrap-kubeconfig:首次启动向 apiserver 申请证书
  6. # –config:配置参数文件
  7. # –cert-dir:kubelet 证书生成目录
  8. # –pod-infra-container-image:管理 Pod 网络容器的镜像
  9. KUBELET_OPTS="--logtostderr=false \
  10. --v=2 \
  11. --log-dir=/opt/kubernetes/logs \
  12. --hostname-override=k8s-master \
  13. --network-plugin=cni \
  14. --kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig \
  15. --bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig \
  16. --config=/opt/kubernetes/cfg/kubelet-config.yml \
  17. --cert-dir=/opt/kubernetes/ssl \
  18. --pod-infra-container-image=lizhenliang/pause-amd64:3.0"
  19. // 2 配置参数文件
  20. vim /opt/kubernetes/cfg/kubelet-config.yml
  21. kind: KubeletConfiguration
  22. apiVersion: kubelet.config.k8s.io/v1beta1
  23. address: 0.0.0.0
  24. port: 10250
  25. readOnlyPort: 10255
  26. cgroupDriver: cgroupfs
  27. clusterDNS:
  28. - 10.0.0.2
  29. clusterDomain: cluster.local
  30. failSwapOn: false
  31. authentication:
  32. anonymous:
  33. enabled: false
  34. webhook:
  35. cacheTTL: 2m0s
  36. enabled: true
  37. x509:
  38. clientCAFile: /opt/ssl/k8s/ca.pem
  39. authorization:
  40. mode: Webhook
  41. webhook:
  42. cacheAuthorizedTTL: 5m0s
  43. cacheUnauthorizedTTL: 30s
  44. evictionHard:
  45. imagefs.available: 15%
  46. memory.available: 100Mi
  47. nodefs.available: 10%
  48. nodefs.inodesFree: 5%
  49. maxOpenFiles: 1000000
  50. maxPods: 110
  51. // 3 生成 bootstrap.kubeconfig 文件
  52. vim /opt/kubernetes/cfg/bootstrap.kubeconfig
  53. KUBE_APISERVER="https://192.168.203.166:6443" # apiserver IP:PORT
  54. TOKEN="c47ffb939f5ca36231d9e3121a252940" # 与 token.csv 里保持一致
  55. # 生成 kubelet bootstrap kubeconfig 配置文件
  56. kubectl config set-cluster kubernetes \
  57. --certificate-authority=/opt/kubernetes/ssl/ca.pem \
  58. --embed-certs=true \
  59. --server=${KUBE_APISERVER} \
  60. --kubeconfig=bootstrap.kubeconfig
  61. kubectl config set-credentials "kubelet-bootstrap" \
  62. --token=${TOKEN} \
  63. --kubeconfig=bootstrap.kubeconfig kubectl config set-context default \
  64. --cluster=kubernetes \
  65. --user="kubelet-bootstrap" \
  66. --kubeconfig=bootstrap.kubeconfig
  67. kubectl config use-context default --kubeconfig=bootstrap.kubeconfig
  68. // 4 systemd 管理 kubelet
  69. systemctl daemon-reload
  70. systemctl start kubelet
  71. systemctl enable kubelet

5 使用官网推荐搭建

5.1 安装 kubeadm

5.1.1 允许 iptables 检查桥接流量

  1. // 1 查询br_netfilter是否被加载
  2. lsmod | grep br_netfilter
  3. // 2 如果未加载,执行如下命令
  4. // 2.1 临时启动
  5. sudo modprobe br_netfilter
  6. // 2.2 设置开机启动
  7. vi /etc/modules-load.d/k8s.conf
  8. br_netfilter
  9. // 3 为了让Linux节点的iptables能够正确地查看桥接流量,需要将sysctl配置中net.bridge.bridge-nf-call-iptables设置为1
  10. vi /etc/sysctl.d/k8s.conf
  11. net.bridge.bridge-nf-call-ip6tables = 1
  12. net.bridge.bridge-nf-call-iptables = 1
  13. // 3.1 使其生效
  14. sudo sysctl --system

5.1.2 检查所需端口

端口和协议

5.1.3 安装运行容器docker

5.1.4 安装 kubeadm、kubelet 和 kubectl

  1. //1 设置yum源
  2. vi /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=1
  8. repo_gpgcheck=1
  9. gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  10. // 2 将 SELinux 设置为 permissive 模式(相当于将其禁用)
  11. // 2.1 临时关闭
  12. sudo setenforce 0
  13. // 2.2 永久关闭
  14. sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
  15. // 3 安装
  16. sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
  17. // 4 激活并启动 kubelet
  18. sudo systemctl enable --now kubelet

5.1.4 配置 cgroup 驱动程序

容器运行时和 kubelet 都具有名字为 “cgroup driver” 的属性,该属性对于在 Linux 机器上管理 CGroups 而言非常重要。

警告: 你需要确保容器运行时和 kubelet 所使用的是相同的 cgroup 驱动,否则 kubelet 进程会失败。 相关细节可参见配置 cgroup 驱动

  1. // 1 配置容器运行时 cgroup 驱动(docker)
  2. mkdir /etc/docker
  3. vi /etc/docker/daemon.json
  4. {
  5. "exec-opts": ["native.cgroupdriver=systemd"],
  6. "log-driver": "json-file",
  7. "log-opts": {
  8. "max-size": "100m"
  9. },
  10. "storage-driver": "overlay2"
  11. }
  12. sudo systemctl enable docker
  13. sudo systemctl daemon-reload
  14. sudo systemctl restart docker
  15. // 2 配置 kubelet 的 cgroup 驱动

5.2 使用 kubeadm 创建集群

5.2.1 初始化(kubeadm init

  1. // 1 关闭swap分区
  2. // 1.1 临时关闭
  3. swapoff -a
  4. // 1.2 永久关闭
  5. // sed 直接对文本文件进行操作 sed -i 's/原字符串/新字符串' 目标文件
  6. sed -ri 's/.*swap.*/#&/' /etc/fstab
  7. // 2 开启6443和10250端口
  8. firewall-cmd --zone=public --add-port=6443/tcp --permanent
  9. firewall-cmd --zone=public --add-port=10250/tcp --permanent
  10. firewall-cmd --reload
  11. // 3 初始化集群
  12. kubeadm init \
  13. --apiserver-advertise-address=本机ip \
  14. --image-repository registry.aliyuncs.com/google_containers \
  15. --pod-network-cidr=10.244.0.0/16

5.2.2 配置网络插件

  1. mkdir -p /etc/cni/net.d
  2. vim ptp.confist
  3. {
  4. "cniVersion": "0.3.1",
  5. "name": "mynet",
  6. "plugins": [
  7. {
  8. "type": "ptp",
  9. "ipMasq": true,
  10. "ipam": {
  11. "type": "host-local",
  12. "subnet": "172.16.30.0/24",
  13. "routes": [
  14. {
  15. "dst": "0.0.0.0/0"
  16. }
  17. ]
  18. }
  19. },
  20. {
  21. "type": "portmap",
  22. "capabilities": {"portMappings": true},
  23. "externalSetMarkChain": "KUBE-MARK-MASQ"
  24. }
  25. ]
  26. }

5.2.3 节点加入集群(kubeadm join

  1. // 1 配置网络
  2. // 2 安装docker,复制deamon.json
  3. // 3 安装 kubeadm、kubelet 和 kubectl
  4. // 4 加入集群
  5. kubeadm join ip:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
  6. // 5 开启10248端口
  7. firewall-cmd --zone=public --add-port=10248/tcp --permanent
  8. firewall-cmd --reload
  9. // 6 配置网络插件同5.2.2

其他