• K8s安装部署-----二进制安装部署


    目录

    前言

    一、操作系统初始化配置

    二、部署 etcd 集群

    1、在master01节点操作

    2、在 node01 节点上操作

    3、在 node02 节点上操作

    4、查看集群状态

    二、部署docker引擎

    三、部署 Master 组件

    1、准备证书

    2、准备二进制文件、token

    3、启动kube-apiserver服务

    4、启动 scheduler 服务

    5、启动controller-manager 服务

    6、生成kubectl连接集群的kubeconfig文件

    7、通过kubectl工具查看当前集群组件状态

    六、部署Worker node组件

    1、在所有 node 节点上操作

    2、在master01上生成文件scp到node01

    3、node01安装kubelet服务

    4、master01验证CSR请求

    ​编辑

    5、node01安装proxy服务

    6、node2启动安装kubelet、proxy服务

    七、部署CNI网络组建

    1、部署flannel

    2、部署calico

    3、node02节点部署

     八、部署core DNS

     九、master02 节点部署

    十、负载均衡部署(lb01、lb02)

    1、部署nginx服务、配置四层负载均衡

    2、部署keepalived服务

    十一、部署Dashboard(master01)

    前言

    Minikube

    • Minikube是一个工具,可以在本地快速运行一个单节点微型K8S,仅用于学习、预览K8S的一些特性使用。
    • 部署地址:https://kubernetes.io/docs/setup/minikube

    Kubeadmin

    • Kubeadmin也是一个工具,提供kubeadm init和kubeadm join,用于快速部署K8S集群,相对简单。
    • https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

    二进制安装部署

    • 生产首选,从官方下载发行版的二进制包,手动部署每个组件和自签TLS证书,组成K8S集群,新手推荐。
    • https://github.com/kubernetes/kubernetes/releases

    小结:Kubeadm降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用二进制包部署Kubernetes集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护。

    端口介绍

    实验环境:

    主机名ip地址所需组件
    master01192.168.247.10kube-apiserver、kubu-controller-manager、kube-scheduler、etcd
    master02192.168.247.20kube-apiserver、kubu-controller-manager、kube-scheduler
    node01192.168.247.30kubelet、kube-proxy、docker、flannel、etcd
    node02192.168.247.40kubelet、kube-proxy、docker、flannel、etcd
    负载均衡01192.168.247.50nginx+keepalive
    负载均衡02192.168.247.60nginx+keepalive

    一、操作系统初始化配置

    一键部署环境脚本。

    1. #!/bin/bash
    2. # 关闭防火墙
    3. systemctl stop firewalld
    4. systemctl disable firewalld
    5. iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
    6. # 关闭selinux
    7. # 永久关闭
    8. sed -i 's/enforcing/disabled/' /etc/selinux/config
    9. # 临时关闭
    10. setenforce 0
    11. # 关闭swap
    12. # 临时
    13. swapoff -a
    14. # 永久关闭
    15. sed -ri 's/.*swap.*/#&/' /etc/fstab
    16. # 在master添加hosts
    17. cat >> /etc/hosts << EOF
    18. 192.168.247.10 master01
    19. 192.168.247.20 master02
    20. 192.168.247.30 node01
    21. 192.168.247.40 node02
    22. EOF
    23. # 将桥接的IPv4流量传递到iptables的链
    24. cat > /etc/sysctl.d/k8s.conf << EOF
    25. #开启网桥模式,可将网桥的流量传递给iptables链
    26. net.bridge.bridge-nf-call-ip6tables = 1
    27. net.bridge.bridge-nf-call-iptables = 1
    28. #关闭ipv6协议
    29. net.ipv6.conf.all.disable_ipv6=1
    30. net.ipv4.ip_forward=1
    31. EOF
    32. # 生效
    33. sysctl --system
    34. # 时间同步
    35. yum install ntpdate -y
    36. ntpdate time.windows.com
    37. crontab -e
    38. */10 * * * * /usr/sbin/ntpdate/ntpdate time.windows.com

    手动修改各个节点的主机名

    1. # 根据规划设置主机名【master01节点上操作】
    2. hostnamectl set-hostname master01
    3. # 根据规划设置主机名【node01节点操作】
    4. hostnamectl set-hostname node01
    5. # 根据规划设置主机名【node02节点操作】
    6. hostnamectl set-hostname node02

    二、部署 etcd 集群

    • etcd分布式键值对的数据库,有服务发现系统。使用go语言开发,使用raft 一致性的算法,集群需要三台以上的奇数台组成。
    • 2379 端口对外(客户端)通讯的端口;2380端口对内(集群内部节点)通信的端口。
    节点名称ip地址
    etcd01192.168.247.10
    etcd02192.168.247.30
    etcd03192.168.247.40

    注:为了节省机器,这里与 K8s 节点机器复用。也可以独立于 k8s 集群之外部署,只要apiserver 能连接到就行。

    准备签发证书环境:

    cfssl是一个开源的证书管理工具,使用配置文件生成证书,因此自签之前,需要生成它识别的 json 格式的配置文件,CFSSL 提供了方便的命令行生成配置文件。

    CFSSL 用来为 etcd 提供 TLS 证书,它支持签三种类型的证书:

    • client 证书,服务端连接客户端时携带的证书,用于客户端验证服务端身份,如 kube-apiserver 访问 etcd;
    • server 证书,客户端连接服务端时携带的证书,用于服务端验证客户端身份,如 etcd 对外提供服务;
    • peer 证书,相互之间连接时使用的证书,如 etcd 节点之间进行验证和通信。

    1、在master01节点操作

    #准备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*
    5. cfssl:证书签发的工具命令
    6. cfssljson:将 cfssl 生成的证书(json格式)变为文件承载式证书
    7. cfssl-certinfo:验证证书的信息
    8. cfssl-certinfo -cert <证书名称> #查看证书的信息

    ### 生成Etcd证书 ###

    1. mkdir -p /opt/k8s
    2. vim /opt/k8s/etcd-cert
    3. #创建etcd证书的文件
    4. #############自签CA,包含证书的过期时间10年 ###############
    5. cat > ca-config.json << EOF
    6. {
    7. "signing": {
    8. "default": {
    9. "expiry": "87600h"
    10. },
    11. "profiles": {
    12. "www": {
    13. "expiry": "87600h",
    14. "usages": [
    15. "signing",
    16. "key encipherment",
    17. "server auth",
    18. "client auth"
    19. ]
    20. }
    21. }
    22. }
    23. }
    24. EOF
    25. cat > ca-csr.json<< EOF
    26. {
    27. "CN": "etcd CA",
    28. "key": {
    29. "algo": "rsa",
    30. "size": 2048
    31. },
    32. "names": [
    33. {
    34. "C": "CN",
    35. "L": "Beijing",
    36. "ST": "Beijing"
    37. }
    38. ]
    39. }
    40. EOF
    41. #######生成证书########################
    42. cfssl gencert -initca ca-csr.json | cfssljson -bare ca
    43. ##当前目录下会生成 ca.pem和ca-key.pem文件
    44. #-----------------------
    45. #生成 etcd 服务器证书和私钥
    46. cat > server-csr.json <
    47. {
    48. "CN": "etcd",
    49. "hosts": [
    50. "192.168.247.10",
    51. "192.168.247.30",
    52. "192.168.247.40"
    53. ],
    54. "key": {
    55. "algo": "rsa",
    56. "size": 2048
    57. },
    58. "names": [
    59. {
    60. "C": "CN",
    61. "L": "BeiJing",
    62. "ST": "BeiJing"
    63. }
    64. ]
    65. }
    66. EOF
    67. #hosts:将所有 etcd 集群节点添加到 host 列表,需要指定所有 etcd 集群的节点 ip 或主机名不能使用网段,新增 etcd 服务器需要重新签发证书。
    68. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server
    69. #生成的文件:
    70. #server.csr:服务器的证书请求文件
    71. #server-key.pem:服务器的私钥
    72. #server.pem:服务器的数字签名证书
    73. #-config:引用证书生成策略文件 ca-config.json
    74. #-profile:指定证书生成策略文件中的的使用场景,比如 ca-config.json 中的 www
    1. vim /opt/k8s/etcd.sh
    2. #!/bin/bash
    3. #example: ./etcd.sh etcd01 192.168.247.10 etcd02=https://192.168.247.30:2380,etcd03=https://192.168.247.40:2380
    4. #创建etcd配置文件/opt/etcd/cfg/etcd
    5. ETCD_NAME=$1
    6. ETCD_IP=$2
    7. ETCD_CLUSTER=$3
    8. WORK_DIR=/opt/etcd
    9. cat > $WORK_DIR/cfg/etcd <
    10. #[Member]
    11. ETCD_NAME="${ETCD_NAME}"
    12. ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
    13. ETCD_LISTEN_PEER_URLS="https://${ETCD_IP}:2380"
    14. ETCD_LISTEN_CLIENT_URLS="https://${ETCD_IP}:2379"
    15. #[Clustering]
    16. ETCD_INITIAL_ADVERTISE_PEER_URLS="https://${ETCD_IP}:2380"
    17. ETCD_ADVERTISE_CLIENT_URLS="https://${ETCD_IP}:2379"
    18. ETCD_INITIAL_CLUSTER="etcd01=https://${ETCD_IP}:2380,${ETCD_CLUSTER}"
    19. ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
    20. ETCD_INITIAL_CLUSTER_STATE="new"
    21. EOF
    22. #Member:成员配置
    23. #ETCD_NAME:节点名称,集群中唯一。成员名字,集群中必须具备唯一性,如etcd01
    24. #ETCD_DATA_DIR:数据目录。指定节点的数据存储目录,这些数据包括节点ID,集群ID>,集群初始化配置,Snapshot文件,若未指定-wal-dir,还会存储WAL文件;如果不指定
    25. 会用缺省目录
    26. #ETCD_LISTEN_PEER_URLS:集群通信监听地址。用于监听其他member发送信息的地址。ip为全0代表监听本机所有接口
    27. #ETCD_LISTEN_CLIENT_URLS:客户端访问监听地址。用于监听etcd客户发送信息的地址>。ip为全0代表监听本机所有接口
    28. #Clustering:集群配置
    29. #ETCD_INITIAL_ADVERTISE_PEER_URLS:集群通告地址。其他member使用,其他member通
    30. 过该地址与本member交互信息。一定要保证从其他member能可访问该地址。静态配置方>式下,该参数的value一定要同时在--initial-cluster参数中存在
    31. #ETCD_ADVERTISE_CLIENT_URLS:客户端通告地址。etcd客户端使用,客户端通过该地址
    32. 与本member交互信息。一定要保证从客户侧能可访问该地址
    33. #ETCD_INITIAL_CLUSTER:集群节点地址。本member使用。描述集群中所有节点的信息,
    34. 本member根据此信息去联系其他member
    35. #ETCD_INITIAL_CLUSTER_TOKEN:集群Token。用于区分不同集群。本地如有多个集群要>设为不同
    36. #ETCD_INITIAL_CLUSTER_STATE:加入集群的当前状态,new是新集群,existing表示加>入已有集群。
    37. #创建etcd.service服务管理文件
    38. cat > /usr/lib/systemd/system/etcd.service <
    39. [Unit]
    40. Description=Etcd Server
    41. After=network.target
    42. After=network-online.target
    43. Wants=network-online.target
    44. [Service]
    45. Type=notify
    46. EnvironmentFile=${WORK_DIR}/cfg/etcd
    47. ExecStart=${WORK_DIR}/bin/etcd \
    48. --cert-file=${WORK_DIR}/ssl/server.pem \
    49. --key-file=${WORK_DIR}/ssl/server-key.pem \
    50. --trusted-ca-file=${WORK_DIR}/ssl/ca.pem \
    51. --peer-cert-file=${WORK_DIR}/ssl/server.pem \
    52. --peer-key-file=${WORK_DIR}/ssl/server-key.pem \
    53. --peer-trusted-ca-file=${WORK_DIR}/ssl/ca.pem \
    54. --logger=zap \
    55. --enable-v2
    56. Restart=on-failure
    57. LimitNOFILE=65536
    58. [Install]
    59. WantedBy=multi-user.target
    60. EOF
    61. #--enable-v2:开启 etcd v2 API 接口。当前 flannel 版本不支持 etcd v3 通信
    62. #--logger=zap:使用 zap 日志框架。zap.Logger 是go语言中相对日志库中性能最高的
    63. #--peer开头的配置项用于指定集群内部TLS相关证书(peer 证书),这里全部都使用同
    64. 一套证书认证
    65. #不带--peer开头的的参数是指定 etcd 服务器TLS相关证书(server 证书),这里全部
    66. 都使用同一套证书认证
    67. systemctl daemon-reload
    68. systemctl enable etcd
    69. systemctl restart etcd
    chmod +x etcd-cert.sh etcd.sh
    

    #创建用于生成CA证书、etcd 服务器证书以及私钥的目录

    1. mkdir /opt/k8s/etcd-cert
    2. mv etcd-cert.sh etcd-cert/
    3. cd /opt/k8s/etcd-cert/
    4. ./etcd-cert.sh #生成CA证书、etcd 服务器证书以及私钥
    5. ls
    6. ca-config.json ca-csr.json ca.pem server.csr server-key.pem
    7. ca.csr ca-key.pem etcd-cert.sh server-csr.json server.pem

    #上传 etcd-v3.4.9-linux-amd64.tar.gz 到 /opt/k8s 目录中,启动etcd服务

    1. https://github.com/etcd-io/etcd/releases/download/v3.4.9/etcd-v3.4.9-linux-amd64.tar.gz
    2. cd /opt/k8s/
    3. tar zxvf etcd-v3.4.9-linux-amd64.tar.gz
    4. ls etcd-v3.4.9-linux-amd64
    5. Documentation etcd etcdctl README-etcdctl.md README.md READMEv2-etcdctl.md
    6. ------------------------------------------------------------------------------------------
    7. etcd就是etcd 服务的启动命令,后面可跟各种启动参数
    8. etcdctl主要为etcd 服务提供了命令行操作

    #创建用于存放 etcd 配置文件,命令文件,证书的目录

    1. mkdir -p /opt/etcd/{cfg,bin,ssl}
    2. cd /opt/k8s/etcd-v3.4.9-linux-amd64/
    3. mv etcd etcdctl /opt/etcd/bin/
    4. cp /opt/k8s/etcd-cert/*.pem /opt/etcd/ssl/
    5. cd /opt/k8s/
    6. ./etcd.sh etcd01 192.168.247.10 etcd02=https://192.168.247.30:2380,etcd03=https://192.168.247.40:2380
    7. #进入卡住状态等待其他节点加入,这里需要三台etcd服务同时启动,如果只启动其中一台后,服务会卡在那里,直到集群中所有etcd节点都已启动,可忽略这个情况
    8. #可另外打开一个窗口查看etcd进程是否正常
    9. ps -ef | grep etcd

    #把etcd相关证书文件、命令文件和服务管理文件全部拷贝到另外两个etcd集群节点

    1. scp -r /opt/etcd/ root@192.168.247.30:/opt/
    2. scp -r /opt/etcd/ root@192.168.247.40:/opt/
    3. scp /usr/lib/systemd/system/etcd.service root@192.168.247.30:/usr/lib/systemd/system/
    4. scp /usr/lib/systemd/system/etcd.service root@192.168.247.40:/usr/lib/systemd/system/

    2、在 node01 节点上操作

    1. vim /opt/etcd/cfg/etcd
    2. #[Member]
    3. ETCD_NAME="etcd02" #修改
    4. ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
    5. ETCD_LISTEN_PEER_URLS="https://192.168.10.18:2380" #修改
    6. ETCD_LISTEN_CLIENT_URLS="https://192.168.10.18:2379" #修改
    7. #[Clustering]
    8. ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.10.18:2380" #修改
    9. ETCD_ADVERTISE_CLIENT_URLS="https://192.168.10.18:2379" #修改
    10. ETCD_INITIAL_CLUSTER="etcd01=https://192.168.10.80:2380,etcd02=https://192.168.10.18:2380,etcd03=https://192.168.10.19:2380"
    11. ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
    12. ETCD_INITIAL_CLUSTER_STATE="new"
    13. #启动etcd服务
    14. systemctl start etcd
    15. systemctl enable etcd ##systemctl enable --now etcd
    16. systemctl在enable、disable、mask子命令里面增加了--now选项,可以激活同时启动服务,激活同时停止服务等。
    17. systemctl status etcd

    3、在 node02 节点上操作

    1. vim /opt/etcd/cfg/etcd
    2. #[Member]
    3. ETCD_NAME="etcd03" #修改
    4. ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
    5. ETCD_LISTEN_PEER_URLS="https://192.168.10.19:2380" #修改
    6. ETCD_LISTEN_CLIENT_URLS="https://192.168.10.19:2379" #修改
    7. #[Clustering]
    8. ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.10.19:2380" #修改
    9. ETCD_ADVERTISE_CLIENT_URLS="https://192.168.10.19:2379" #修改
    10. ETCD_INITIAL_CLUSTER="etcd01=https://192.168.10.80:2380,etcd02=https://192.168.10.18:2380,etcd03=https://192.168.10.19:2380"
    11. ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
    12. ETCD_INITIAL_CLUSTER_STATE="new"
    13. #启动etcd服务
    14. systemctl start etcd
    15. systemctl enable etcd
    16. systemctl status etcd

    4、查看集群状态

    #检查etcd群集状态

    1. ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.247.10:2379,https://192.168.247.30:2379,https://192.168.247.40:2379" endpoint health --write-out=table
    2. ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.247.10:2379,https://192.168.247.30:2379,https://192.168.247.40:2379" endpoint status --write-out=table
    3. ------------------------------------------------------------------------------------------
    4. --cert-file:识别HTTPS端使用SSL证书文件
    5. --key-file:使用此SSL密钥文件标识HTTPS客户端
    6. --ca-file:使用此CA证书验证启用https的服务器的证书
    7. --endpoints:集群中以逗号分隔的机器地址列表
    8. cluster-health:检查etcd集群的运行状况

    #查看etcd集群成员列表

    ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.247.10:2379,https://192.168.247.30:2379,https://192.168.247.40:2379" --write-out=table member list
    

    二、部署docker引擎

    //所有 node 节点部署docker引擎

    1. yum install -y yum-utils device-mapper-persistent-data lvm2
    2. yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    3. yum install -y docker-ce docker-ce-cli containerd.io
    4. systemctl start docker.service
    5. systemctl enable docker.service

    三、部署 Master 组件

    在 master01 节点上操作:
    #上传 master.zip 和 k8s-cert.sh 到 /opt/k8s 目录中,解压 master.zip 压缩包

    1. cd /opt/k8s/
    2. unzip master.zip
    3. chmod +x *.sh
    4. mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}

    1、准备证书

    #创建用于生成CA证书、相关组件的证书和私钥的目录

    1. mkdir /opt/k8s/k8s-cert
    2. vim /opt/k8s/k8s-cert/k8s-cert.sh
    3. #!/bin/bash
    4. #配置证书生成策略,让 CA 软件知道颁发有什么功能的证书,生成用来签发其他组件证书的根证书
    5. cat > ca-config.json <
    6. {
    7. "signing": {
    8. "default": {
    9. "expiry": "87600h"
    10. },
    11. "profiles": {
    12. "kubernetes": {
    13. "expiry": "87600h",
    14. "usages": [
    15. "signing",
    16. "key encipherment",
    17. "server auth",
    18. "client auth"
    19. ]
    20. }
    21. }
    22. }
    23. }
    24. EOF
    25. #生成CA证书和私钥(根证书和私钥)
    26. cat > ca-csr.json <
    27. {
    28. "CN": "kubernetes",
    29. "key": {
    30. "algo": "rsa",
    31. "size": 2048
    32. },
    33. "names": [
    34. {
    35. "C": "CN",
    36. "L": "Beijing",
    37. "ST": "Beijing",
    38. "O": "k8s",
    39. "OU": "System"
    40. }
    41. ]
    42. }
    43. EOF
    44. cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
    45. #-----------------------
    46. #生成 apiserver 的证书和私钥(apiserver和其它k8s组件通信使用)
    47. #hosts中将所有可能作为 apiserver 的 ip 添加进去,后面 keepalived 使用的 VIP 也要加入
    48. cat > apiserver-csr.json <
    49. {
    50. "CN": "kubernetes",
    51. "hosts": [
    52. "10.0.0.1",
    53. "127.0.0.1",
    54. "192.168.247.10",
    55. "192.168.247.20",
    56. "192.168.247.100",
    57. "192.168.247.50",
    58. "192.168.247.60",
    59. "kubernetes",
    60. "kubernetes.default",
    61. "kubernetes.default.svc",
    62. "kubernetes.default.svc.cluster",
    63. "kubernetes.default.svc.cluster.local"
    64. ],
    65. "key": {
    66. "algo": "rsa",
    67. "size": 2048
    68. },
    69. "names": [
    70. {
    71. "C": "CN",
    72. "L": "BeiJing",
    73. "ST": "BeiJing",
    74. "O": "k8s",
    75. "OU": "System"
    76. }
    77. ]
    78. }
    79. EOF
    80. //
    81. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes apiserver-csr.json | cfssljson -bare apiserver
    82. #-----------------------
    83. #生成 kubectl 连接集群的证书和私钥,具有admin权限
    84. cat > admin-csr.json <
    85. {
    86. "CN": "admin",
    87. "hosts": [],
    88. "key": {
    89. "algo": "rsa",
    90. "size": 2048
    91. },
    92. "names": [
    93. {
    94. "C": "CN",
    95. "L": "BeiJing",
    96. "ST": "BeiJing",
    97. "O": "system:masters",
    98. "OU": "System"
    99. }
    100. ]
    101. }
    102. EOF
    103. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
    104. #-----------------------
    105. #生成 kube-proxy 的证书和私钥
    106. cat > kube-proxy-csr.json <
    107. {
    108. "CN": "system:kube-proxy",
    109. "hosts": [],
    110. "key": {
    111. "algo": "rsa",
    112. "size": 2048
    113. },
    114. "names": [
    115. {
    116. "C": "CN",
    117. "L": "BeiJing",
    118. "ST": "BeiJing",
    119. "O": "k8s",
    120. "OU": "System"
    121. }
    122. ]
    123. }
    124. EOF
    125. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy

    此处一定要检查生成的证书配置文件是否到位

    2、准备二进制文件、token

    准备二进制文件

    cp ca*pem apiserver*pem /opt/kubernetes/ssl/
    

    #上传 kubernetes-server-linux-amd64.tar.gz 到 /opt/k8s/ 目录中,解压 kubernetes 压缩包

    1. cd /opt/k8s/
    2. tar zxvf kubernetes-server-linux-amd64.tar.gz
    3. cd /opt/k8s/kubernetes/server/bin
    4. cp kube-apiserver kubectl kube-controller-manager kube-scheduler /opt/kubernetes/bin/
    5. ln -s /opt/kubernetes/bin/* /usr/local/bin/

     准备token令牌

    #创建 bootstrap token 认证文件,apiserver 启动时会调用,然后就相当于在集群内创建了一个这个用户,接下来就可以用 RBAC 给他授权

    1. cd /opt/k8s/
    2. vim token.sh
    3. #!/bin/bash
    4. #获取随机数前16个字节内容,以十六进制格式输出,并删除其中空格
    5. BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ')
    6. #生成 token.csv 文件,按照 Token序列号,用户名,UID,用户组 的格式生成
    7. cat > /opt/kubernetes/cfg/token.csv <
    8. ${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
    9. EOF
    10. chmod +x token.sh
    11. ./token.sh
    12. cat /opt/kubernetes/cfg/token.csv

    3、启动kube-apiserver服务

    准备启动脚本

    1. vim /opt/k8s/k8s-cert/apiserver.sh
    2. #!/bin/bash
    3. #例子: apiserver.sh 192.168.247.10 https://192.168.247.10 :2379,https://192.168.247.30:2379,https://192.168.247.40:2379
    4. #创建 kube-apiserver 启动参数配置文件
    5. MASTER_ADDRESS=$1
    6. ETCD_SERVERS=$2
    7. cat >/opt/kubernetes/cfg/kube-apiserver <
    8. KUBE_APISERVER_OPTS="--logtostderr=false \\
    9. --v=2 \\
    10. --log-dir=/opt/kubernetes/logs \\
    11. --etcd-servers=${ETCD_SERVERS} \\
    12. --bind-address=${MASTER_ADDRESS} \\
    13. --secure-port=6443 \\
    14. --advertise-address=${MASTER_ADDRESS} \\
    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-50000 \\
    22. --kubelet-client-certificate=/opt/kubernetes/ssl/apiserver.pem \\
    23. --kubelet-client-key=/opt/kubernetes/ssl/apiserver-key.pem \\
    24. --tls-cert-file=/opt/kubernetes/ssl/apiserver.pem \\
    25. --tls-private-key-file=/opt/kubernetes/ssl/apiserver-key.pem \\
    26. --client-ca-file=/opt/kubernetes/ssl/ca.pem \\
    27. --service-account-key-file=/opt/kubernetes/ssl/ca-key.pem \\
    28. --service-account-issuer=api \\
    29. --service-account-signing-key-file=/opt/kubernetes/ssl/apiserver-key.pem \\
    30. --etcd-cafile=/opt/etcd/ssl/ca.pem \\
    31. --etcd-certfile=/opt/etcd/ssl/server.pem \\
    32. --etcd-keyfile=/opt/etcd/ssl/server-key.pem \\
    33. --requestheader-client-ca-file=/opt/kubernetes/ssl/ca.pem \\
    34. --proxy-client-cert-file=/opt/kubernetes/ssl/apiserver.pem \\
    35. --proxy-client-key-file=/opt/kubernetes/ssl/apiserver-key.pem \\
    36. --requestheader-allowed-names=kubernetes \\
    37. --requestheader-extra-headers-prefix=X-Remote-Extra- \\
    38. --requestheader-group-headers=X-Remote-Group \\
    39. --requestheader-username-headers=X-Remote-User \\
    40. --enable-aggregator-routing=true \\
    41. --audit-log-maxage=30 \\
    42. --audit-log-maxbackup=3 \\
    43. --audit-log-maxsize=100 \\
    44. --audit-log-path=/opt/kubernetes/logs/k8s-audit.log"
    45. EOF
    46. #--logtostderr=true:启用日志。输出日志到标准错误控制台,不输出到文件
    47. #--v=4:日志等级。指定输出日志的级别,v=4为调试级别详细输出
    48. #--etcd-servers:etcd集群地址。指定etcd服务器列表(格式://ip:port),逗号分隔
    49. #--bind-address:监听地址。指定 HTTPS 安全接口的监听地址,默认值0.0.0.0
    50. #--secure-port:https安全端口。指定 HTTPS 安全接口的监听端口,默认值6443
    51. #--advertise-address:集群通告地址。通过该 ip 地址向集群其他节点公布 api server 的信息,必须能够被其他节点访问
    52. #--allow-privileged=true:启用授权。允许拥有系统特权的容器运行,默认值false
    53. #--service-cluster-ip-range:Service虚拟IP地址段。指定 Service Cluster IP 地址段
    54. #--enable-admission-plugins:准入控制模块。kuberneres集群的准入控制机制,各控制模块以插件的形式依次生效,集群时必须包含ServiceAccount,运行在认证(Authentication)、授权(Authorization)之后,Admission Control是权限认证链上的最后一环, 对请求API资源对象进行修改和校验
    55. #--authorization-mode:认证授权,启用RBAC授权和节点自管理。在安全端口使用RBAC,Node授权模式,未通过授权的请求拒绝,默认值AlwaysAllow。RBAC是用户通过角色与权限进行关联的模式;Node模式(节点授权)是一种特殊用途的授权模式,专门授权由kubelet发出的API请求,在进行认证时,先通过用户名、用户分组验证是否是集群中的Node节点,只有是Node节点的请求才能使用Node模式授权
    56. #--enable-bootstrap-token-auth:启用TLS bootstrap机制。在apiserver上启用Bootstrap Token 认证
    57. #--token-auth-file=/opt/kubernetes/cfg/token.csv:指定bootstrap token认证文件路径
    58. #--service-node-port-range:指定 Service NodePort 的端口范围,默认值30000-32767
    59. #–-kubelet-client-xxx:apiserver访问kubelet客户端证书
    60. #--tls-xxx-file:apiserver https证书
    61. #1.20版本必须加的参数:–-service-account-issuer,–-service-account-signing-key-file
    62. #--etcd-xxxfile:连接Etcd集群证书
    63. #–-audit-log-xxx:审计日志
    64. #启动聚合层相关配置:–requestheader-client-ca-file,–proxy-client-cert-file,–proxy-client-key-file,–requestheader-allowed-names,–requestheader-extra-headers-prefix,–requestheader-group-headers,–requestheader-username-headers,–enable-aggregator-routing
    65. #创建 kube-apiserver.service 服务管理文件
    66. cat >/usr/lib/systemd/system/kube-apiserver.service <
    67. [Unit]
    68. Description=Kubernetes API Server
    69. Documentation=https://github.com/kubernetes/kubernetes
    70. [Service]
    71. EnvironmentFile=-/opt/kubernetes/cfg/kube-apiserver
    72. ExecStart=/opt/kubernetes/bin/kube-apiserver \$KUBE_APISERVER_OPTS
    73. Restart=on-failure
    74. [Install]
    75. WantedBy=multi-user.target
    76. EOF
    77. systemctl daemon-reload
    78. systemctl enable kube-apiserver
    79. systemctl restart kube-apiserver

    执行脚本、验证是否启动成功

    1. cd /opt/k8s/k8s-cert
    2. ./apiserver.sh 192.168.247.10 https://192.168.247.10:2379,https://192.168.247.30:2379,https://192.168.247.40:2379
    3. #执行创建的脚本,注意有两个位置变量,一个是确定本机的IP地址,一个是etcd集群的IP和端口
    4. ps aux | grep kube-apiserver
    5. #检查进程是否启动成功
    6. netstat -natp | grep 6443
    7. #安全端口6443用于接收HTTPS请求,用于基于Token文件或客户端证书等认证

    4、启动 scheduler 服务

    准备启动脚本,脚本放在 /opt/k8s 中

    1. vim /opt/k8s/k8s-cert/scheduler.sh
    2. #!/bin/bash
    3. ##创建 kube-scheduler 启动参数配置文件
    4. MASTER_ADDRESS=$1
    5. cat >/opt/kubernetes/cfg/kube-scheduler <
    6. KUBE_SCHEDULER_OPTS="--logtostderr=false \\
    7. --v=2 \\
    8. --log-dir=/opt/kubernetes/logs \\
    9. --leader-elect=true \\
    10. --kubeconfig=/opt/kubernetes/cfg/kube-scheduler.kubeconfig \\
    11. --bind-address=127.0.0.1"
    12. EOF
    13. #-–kubeconfig:连接 apiserver 用的配置文件,用于识别 k8s 集群
    14. #--leader-elect=true:当该组件启动多个时,自动启动 leader 选举
    15. #k8s中Controller-Manager和Scheduler的选主逻辑:k8s中的etcd是整个集群所有状态信息的存储,涉及数据的读写和多个etcd之间数据的同步,对数据的一致性要求严格,所以使用较复杂的 raft 算法来选择用于提交数据的主节点。而 apiserver 作为集群入口,本身是无状态的web服务器,多个 apiserver 服务之间直接负载请求并不需要做选主。Controller-Manager 和 Scheduler 作为任务类型的组件,比如 controller-manager 内置的 k8s 各种资源对象的控制器实时的 watch apiserver 获取对象最新的变化事件做期望状态和实际状态调整,调度器watch未绑定节点的pod做节点选择,显然多个这些任务同时工作是完全没有必要的,所以 controller-manager 和 scheduler 也是需要选主的,但是选主逻辑和 etcd 不一样的,这里只需要保证从多个 controller-manager 和 scheduler 之间选出一个 leader 进入工作状态即可,而无需考虑它们之间的数据一致和同步。
    16. ##生成kube-scheduler证书
    17. cd /opt/k8s/k8s-cert/
    18. #创建证书请求文件
    19. cat > kube-scheduler-csr.json << EOF
    20. {
    21. "CN": "system:kube-scheduler",
    22. "hosts": [],
    23. "key": {
    24. "algo": "rsa",
    25. "size": 2048
    26. },
    27. "names": [
    28. {
    29. "C": "CN",
    30. "L": "BeiJing",
    31. "ST": "BeiJing",
    32. "O": "system:masters",
    33. "OU": "System"
    34. }
    35. ]
    36. }
    37. EOF
    38. #生成证书
    39. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-scheduler-csr.json | cfssljson -bare kube-scheduler
    40. #生成kubeconfig文件
    41. KUBE_CONFIG="/opt/kubernetes/cfg/kube-scheduler.kubeconfig"
    42. KUBE_APISERVER="https://$MASTER_ADDRESS:6443"
    43. kubectl config set-cluster kubernetes \
    44. --certificate-authority=/opt/kubernetes/ssl/ca.pem \
    45. --embed-certs=true \
    46. --server=${KUBE_APISERVER} \
    47. --kubeconfig=${KUBE_CONFIG}
    48. kubectl config set-credentials kube-scheduler \
    49. --client-certificate=./kube-scheduler.pem \
    50. --client-key=./kube-scheduler-key.pem \
    51. --embed-certs=true \
    52. --kubeconfig=${KUBE_CONFIG}
    53. kubectl config set-context default \
    54. --cluster=kubernetes \
    55. --user=kube-scheduler \
    56. --kubeconfig=${KUBE_CONFIG}
    57. kubectl config use-context default --kubeconfig=${KUBE_CONFIG}
    58. ##创建 kube-scheduler.service 服务管理文件
    59. cat >/usr/lib/systemd/system/kube-scheduler.service <
    60. [Unit]
    61. Description=Kubernetes Scheduler
    62. Documentation=https://github.com/kubernetes/kubernetes
    63. [Service]
    64. EnvironmentFile=-/opt/kubernetes/cfg/kube-scheduler
    65. ExecStart=/opt/kubernetes/bin/kube-scheduler \$KUBE_SCHEDULER_OPTS
    66. Restart=on-failure
    67. [Install]
    68. WantedBy=multi-user.target
    69. EOF
    70. systemctl daemon-reload
    71. systemctl enable kube-scheduler
    72. systemctl restart kube-scheduler

    执行脚本、验证是否启动成功

    1. cd /opt/k8s/k8s-cert
    2. ./scheduler.sh 192.168.247.10
    3. #执行脚本,主要位置变量,需要写入本机的IP地址
    4. ps aux | grep kube-scheduler

    5、启动controller-manager 服务

    准备启动脚本

    1. vim /opt/k8s/k8s-cert/controller-manager.sh
    2. #!/bin/bash
    3. ##创建 kube-controller-manager 启动参数配置文件
    4. MASTER_ADDRESS=$1
    5. cat >/opt/kubernetes/cfg/kube-controller-manager <
    6. KUBE_CONTROLLER_MANAGER_OPTS="--logtostderr=false \\
    7. --v=2 \\
    8. --log-dir=/opt/kubernetes/logs \\
    9. --leader-elect=true \\
    10. --kubeconfig=/opt/kubernetes/cfg/kube-controller-manager.kubeconfig \\
    11. --bind-address=127.0.0.1 \\
    12. --allocate-node-cidrs=true \\
    13. --cluster-cidr=10.244.0.0/16 \\
    14. --service-cluster-ip-range=10.0.0.0/24 \\
    15. --cluster-signing-cert-file=/opt/kubernetes/ssl/ca.pem \\
    16. --cluster-signing-key-file=/opt/kubernetes/ssl/ca-key.pem \\
    17. --root-ca-file=/opt/kubernetes/ssl/ca.pem \\
    18. --service-account-private-key-file=/opt/kubernetes/ssl/ca-key.pem \\
    19. --cluster-signing-duration=87600h0m0s"
    20. EOF
    21. #––leader-elect:当该组件启动多个时,自动选举(HA)
    22. #-–kubeconfig:连接 apiserver 用的配置文件,用于识别 k8s 集群
    23. #--cluster-cidr=10.244.0.0/16:pod资源的网段,需与pod网络插件的值设置一致。通常,Flannel网络插件的默认为10.244.0.0/16,Calico插件的默认值为192.168.0.0/16
    24. #--cluster-signing-cert-file/–-cluster-signing-key-file:自动为kubelet颁发证书的CA,与apiserver保持一致。指定签名的CA机构根证书,用来签名为 TLS BootStrapping 创建的证书和私钥
    25. #--root-ca-file:指定根CA证书文件路径,用来对 kube-apiserver 证书进行校验,指定该参数后,才会在 Pod 容器的 ServiceAccount 中放置该 CA 证书文件
    26. #--experimental-cluster-signing-duration:设置为 TLS BootStrapping 签署的证书有效时间为10年,默认为1年
    27. ##生成kube-controller-manager证书
    28. cd /opt/k8s/k8s-cert/
    29. #创建证书请求文件
    30. cat > kube-controller-manager-csr.json << EOF
    31. {
    32. "CN": "system:kube-controller-manager",
    33. "hosts": [],
    34. "key": {
    35. "algo": "rsa",
    36. "size": 2048
    37. },
    38. "names": [
    39. {
    40. "C": "CN",
    41. "L": "BeiJing",
    42. "ST": "BeiJing",
    43. "O": "system:masters",
    44. "OU": "System"
    45. }
    46. ]
    47. }
    48. EOF
    49. #生成证书
    50. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-controller-manager-csr.json | cfssljson -bare kube-controller-manager
    51. #生成kubeconfig文件
    52. KUBE_CONFIG="/opt/kubernetes/cfg/kube-controller-manager.kubeconfig"
    53. KUBE_APISERVER="https://$1:6443"
    54. kubectl config set-cluster kubernetes \
    55. --certificate-authority=/opt/kubernetes/ssl/ca.pem \
    56. --embed-certs=true \
    57. --server=${KUBE_APISERVER} \
    58. --kubeconfig=${KUBE_CONFIG}
    59. kubectl config set-credentials kube-controller-manager \
    60. --client-certificate=./kube-controller-manager.pem \
    61. --client-key=./kube-controller-manager-key.pem \
    62. --embed-certs=true \
    63. --kubeconfig=${KUBE_CONFIG}
    64. kubectl config set-context default \
    65. --cluster=kubernetes \
    66. --user=kube-controller-manager \
    67. --kubeconfig=${KUBE_CONFIG}
    68. kubectl config use-context default --kubeconfig=${KUBE_CONFIG}
    69. ##创建 kube-controller-manager.service 服务管理文件
    70. cat >/usr/lib/systemd/system/kube-controller-manager.service <
    71. [Unit]
    72. Description=Kubernetes Controller Manager
    73. Documentation=https://github.com/kubernetes/kubernetes
    74. [Service]
    75. EnvironmentFile=-/opt/kubernetes/cfg/kube-controller-manager
    76. ExecStart=/opt/kubernetes/bin/kube-controller-manager \$KUBE_CONTROLLER_MANAGER_OPTS
    77. Restart=on-failure
    78. [Install]
    79. WantedBy=multi-user.target
    80. EOF
    81. systemctl daemon-reload
    82. systemctl enable kube-controller-manager
    83. systemctl restart kube-controller-manager

    执行脚本、验证是否启动成功

    1. cd /opt/k8s/k8s-cert
    2. ./controller-manager.sh 192.168.247.10
    3. #启动脚本,并带上位置变量,位置变量为本机IP
    4. ps aux | grep kube-controller-manager

    6、生成kubectl连接集群的kubeconfig文件

    准备执行脚本

    1. vim /opt/k8s/k8s-cert/admin.sh
    2. #!/bin/bash
    3. mkdir /root/.kube
    4. KUBE_CONFIG="/root/.kube/config"
    5. KUBE_APISERVER="https://192.168.247.10:6443"
    6. cd /opt/k8s/k8s-cert/
    7. kubectl config set-cluster kubernetes \
    8. --certificate-authority=/opt/kubernetes/ssl/ca.pem \
    9. --embed-certs=true \
    10. --server=${KUBE_APISERVER} \
    11. --kubeconfig=${KUBE_CONFIG}
    12. kubectl config set-credentials cluster-admin \
    13. --client-certificate=./admin.pem \
    14. --client-key=./admin-key.pem \
    15. --embed-certs=true \
    16. --kubeconfig=${KUBE_CONFIG}
    17. kubectl config set-context default \
    18. --cluster=kubernetes \
    19. --user=cluster-admin \
    20. --kubeconfig=${KUBE_CONFIG}
    21. kubectl config use-context default --kubeconfig=${KUBE_CONFIG}

    执行脚本

    1. ./admin.sh
    2. kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous

    7、通过kubectl工具查看当前集群组件状态

    1. kubectl get cs
    2. #查看当前集群组件状态(都为健康状态即可,如果不健康,需要排错)
    3. kubectl version
    4. #查看版本信息(显示客户端和服务端的版本信息)

    六、部署Worker node组件

    1、在所有 node 节点上操作

    1. mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
    2. #创建kubernetes的工作目录(提前创建号两个node的k8s的工作目录)

    2、在master01上生成文件scp到node01

    1. cd /opt/k8s/k8s-cert/kubernetes/server/bin
    2. #在master01中进入到前面解压的用压缩文件,里面有node节点需要用到的两个组件,一个kubelet、一个lube-proxy组件
    3. scp kubelet kube-proxy root@192.168.247.30:/opt/kubernetes/bin/
    4. scp kubelet kube-proxy root@192.168.247.40:/opt/kubernetes/bin/
    5. #把kubelet、kube-proxy 拷贝到 node 节点的工作目录中(因为是执行文件所以拷贝到bin目录下)

    准备kubeconfig脚本文件

    1. vim /opt/k8s/k8s-cert/kubeconfig.sh
    2. #!/bin/bash
    3. #example: kubeconfig 192.168.247.10 /opt/k8s/k8s-cert/
    4. #创建bootstrap.kubeconfig文件
    5. #该文件中内置了 token.csv 中用户的 Token,以及 apiserver CA 证书;kubelet 首次启动会加载此文件,使用 apiserver CA 证书建立与 apiserver 的 TLS 通讯,使用其中的用户 Token 作为身份标识向 apiserver 发起 CSR 请求
    6. BOOTSTRAP_TOKEN=$(awk -F ',' '{print $1}' /opt/kubernetes/cfg/token.csv)
    7. #获取token令牌
    8. APISERVER=$1 #位置变量,获取本机ip
    9. SSL_DIR=$2 #获取存放路径。
    10. export KUBE_APISERVER="https://$APISERVER:6443"
    11. # 设置集群参数
    12. kubectl config set-cluster kubernetes \
    13. --certificate-authority=$SSL_DIR/ca.pem \
    14. --embed-certs=true \
    15. --server=${KUBE_APISERVER} \
    16. --kubeconfig=bootstrap.kubeconfig
    17. #--embed-certs=true:表示将ca.pem证书写入到生成的bootstrap.kubeconfig文件中
    18. # 设置客户端认证参数,kubelet 使用 bootstrap token 认证
    19. kubectl config set-credentials kubelet-bootstrap \
    20. --token=${BOOTSTRAP_TOKEN} \
    21. --kubeconfig=bootstrap.kubeconfig
    22. # 设置上下文参数
    23. kubectl config set-context default \
    24. --cluster=kubernetes \
    25. --user=kubelet-bootstrap \
    26. --kubeconfig=bootstrap.kubeconfig
    27. # 使用上下文参数生成 bootstrap.kubeconfig 文件
    28. kubectl config use-context default --kubeconfig=bootstrap.kubeconfig
    29. #----------------------
    30. #创建kube-proxy.kubeconfig文件
    31. # 设置集群参数
    32. kubectl config set-cluster kubernetes \
    33. --certificate-authority=$SSL_DIR/ca.pem \
    34. --embed-certs=true \
    35. --server=${KUBE_APISERVER} \
    36. --kubeconfig=kube-proxy.kubeconfig
    37. # 设置客户端认证参数,kube-proxy 使用 TLS 证书认证
    38. kubectl config set-credentials kube-proxy \
    39. --client-certificate=$SSL_DIR/kube-proxy.pem \
    40. --client-key=$SSL_DIR/kube-proxy-key.pem \
    41. --embed-certs=true \
    42. --kubeconfig=kube-proxy.kubeconfig
    43. # 设置上下文参数
    44. kubectl config set-context default \
    45. --cluster=kubernetes \
    46. --user=kube-proxy \
    47. --kubeconfig=kube-proxy.kubeconfig
    48. # 使用上下文参数生成 kube-proxy.kubeconfig 文件
    49. kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig

    执行脚本文件

    1. cd /opt/k8s/k8s-cert/
    2. chmod +x kubeconfig.sh
    3. ./kubeconfig.sh 192.168.247.10 /opt/k8s/k8s-cert/
    4. #执行脚本,需要添加两个位置变量,一个本机IP,一个生成的文件所在的目录
    1. cd /opt/k8s/k8s-cert/
    2. scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.247.30:/opt/kubernetes/cfg/
    3. scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.247.40:/opt/kubernetes/cfg/
    4. #把配置文件 bootstrap.kubeconfig、kube-proxy.kubeconfig 拷贝到 node 节点
    5. #RBAC授权,使用户 kubelet-bootstrap 能够有权限发起 CSR 请求
    6. kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
    7. #如想重新配置CSR可kubectl delete clusterrolebinding kubelet-bootstrap清空CSR请求

    3、node01安装kubelet服务

    准备kubelet服务的执行脚本文件

    1. mkdir /opt/k8s-cert/
    2. #创建一个目录用来存储脚本文件
    3. vim /opt/k8s-cert/kubelet.sh
    4. #!/bin/bash
    5. #例子:./kubelet.sh 192.168.247.30
    6. NODE_ADDRESS=$1
    7. DNS_SERVER_IP=${2:-"10.0.0.2"}
    8. #创建 kubelet 启动参数配置文件
    9. cat >/opt/kubernetes/cfg/kubelet <
    10. KUBELET_OPTS="--logtostderr=false \\
    11. --v=2 \\
    12. --log-dir=/opt/kubernetes/logs \\
    13. --hostname-override=${NODE_ADDRESS} \\
    14. --network-plugin=cni \\
    15. --kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig \\
    16. --bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig \\
    17. --config=/opt/kubernetes/cfg/kubelet.config \\
    18. --cert-dir=/opt/kubernetes/ssl \\
    19. --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0"
    20. EOF
    21. #--hostname-override:指定kubelet节点在集群中显示的主机名或IP地址,默认使用主机hostname;kube-proxy和kubelet的此项参数设置必须完全一致
    22. #--network-plugin:启用CNI
    23. #--kubeconfig:指定kubelet.kubeconfig文件位置,当前为空路径,会自动生成,用于如何连接到apiserver,里面含有kubelet证书,master授权完成后会在node节点上生成 kubelet.kubeconfig 文件
    24. #--bootstrap-kubeconfig:指定连接 apiserver 的 bootstrap.kubeconfig 文件
    25. #--config:指定kubelet配置文件的路径,启动kubelet时将从此文件加载其配置
    26. #--cert-dir:指定master颁发的kubelet证书生成目录
    27. #--pod-infra-container-image:指定Pod基础容器(Pause容器)的镜像。Pod启动的时候都会启动一个这样的容器,每个pod之间相互通信需要Pause的支持,启动Pause需要Pause基础镜像
    28. #----------------------
    29. #创建kubelet配置文件(该文件实际上就是一个yml文件,语法非常严格,不能出现tab键,冒号后面必须要有空格,每行结尾也不能有空格)
    30. cat >/opt/kubernetes/cfg/kubelet.config <
    31. kind: KubeletConfiguration
    32. apiVersion: kubelet.config.k8s.io/v1beta1
    33. address: ${NODE_ADDRESS}
    34. port: 10250
    35. readOnlyPort: 10255
    36. cgroupDriver: cgroupfs
    37. clusterDNS:
    38. - ${DNS_SERVER_IP}
    39. clusterDomain: cluster.local
    40. failSwapOn: false
    41. authentication:
    42. anonymous:
    43. enabled: true
    44. EOF
    45. #PS:当命令行参数与此配置文件(kubelet.config)有相同的值时,就会覆盖配置文件中的该值。
    46. #----------------------
    47. #创建 kubelet.service 服务管理文件
    48. cat >/usr/lib/systemd/system/kubelet.service <
    49. [Unit]
    50. Description=Kubernetes Kubelet
    51. After=docker.service
    52. Requires=docker.service
    53. [Service]
    54. EnvironmentFile=/opt/kubernetes/cfg/kubelet
    55. ExecStart=/opt/kubernetes/bin/kubelet \$KUBELET_OPTS
    56. Restart=on-failure
    57. KillMode=process
    58. [Install]
    59. WantedBy=multi-user.target
    60. EOF
    61. systemctl daemon-reload
    62. systemctl enable kubelet
    63. systemctl restart kubelet

    执行脚本

    1. cd /opt
    2. chmod +x kubelet.sh
    3. ./kubelet.sh 192.168.247.30
    4. #执行脚本,需要带上本机node节点的IP,此脚本,主要是触发关键kubelet的配置文件,启动kubelet的时候,也相当于给master01发送了CSR认证请求。
    5. ps aux|grep kubelet
    6. #查看是否启动

    4、master01验证CSR请求

    1. kubectl get csr
    2. #检查到 node01 节点的 kubelet 发起的 CSR 请求,Pending 表示等待集群给该节点签发证书
    3. kubectl certificate approve 【node-csr-duiobEzQ0R93HsULoS9NT9JaQylMmid_nBF3Ei3NtFE(这里面的根据实际的来)】
    4. #通过CSR请求
    5. kubectl get csr
    6. #Approved,Issued 表示已授权 CSR 请求并签发证书
    7. kubectl get node
    8. #查看节点,由于网络插件还没有部署,节点会没有准备就绪,就会显示NotReady

    5、node01安装proxy服务

    准备执行脚本

    1. for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done
    2. #使用一个for循环,加载ip_vs模块
    3. -------------------------------------------------------------------------------
    4. vim /opt/k8s-cert/proxy.sh
    5. #!/bin/bash
    6. #例子: ./proxy.sh 192.168.247.30
    7. NODE_ADDRESS=$1
    8. #创建 kube-proxy 启动参数配置文件
    9. cat >/opt/kubernetes/cfg/kube-proxy <
    10. KUBE_PROXY_OPTS="--logtostderr=true \\
    11. --v=4 \\
    12. --hostname-override=${NODE_ADDRESS} \\
    13. --cluster-cidr=172.17.0.0/16 \\
    14. --proxy-mode=ipvs \\
    15. --kubeconfig=/opt/kubernetes/cfg/kube-proxy.kubeconfig"
    16. EOF
    17. #--hostnameOverride: 参数值必须与 kubelet 的值一致,否则 kube-proxy 启动后会找不到该 Node,从而不会创建任何 ipvs 规则
    18. #--cluster-cidr:指定 Pod 网络使用的聚合网段,Pod 使用的网段和 apiserver 中指定的 service 的 cluster ip 网段不是同一个网段。 kube-proxy 根据 --cluster-cidr 判断集群内部和外部流量,指定 --cluster-cidr 选项后 kube-proxy 才会对访问 Service IP 的请求做 SNAT,即来自非 Pod 网络的流量被当成外部流量,访问 Service 时需要做 SNAT。
    19. #--proxy-mode:指定流量调度模式为ipvs模式,可添加--ipvs-scheduler选项指定ipvs调度算法(rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq)
    20. #--kubeconfig: 指定连接 apiserver 的 kubeconfig 文件
    21. #----------------------
    22. #创建 kube-proxy.service 服务管理文件
    23. cat >/usr/lib/systemd/system/kube-proxy.service <
    24. [Unit]
    25. Description=Kubernetes Proxy
    26. After=network.target
    27. [Service]
    28. EnvironmentFile=-/opt/kubernetes/cfg/kube-proxy
    29. ExecStart=/opt/kubernetes/bin/kube-proxy \$KUBE_PROXY_OPTS
    30. Restart=on-failure
    31. [Install]
    32. WantedBy=multi-user.target
    33. EOF
    34. systemctl daemon-reload
    35. systemctl enable kube-proxy
    36. systemctl restart kube-proxy

    执行脚本

    1. cd /opt
    2. chmod +x proxy.sh
    3. ./proxy.sh 192.168.247.30
    4. #指向脚本,注意需要带入位置参数,为本机的IP地址,此脚本主要时配置proxy的配置文件,并启动它
    5. ps aux |grep kube-proxy

    6、node2启动安装kubelet、proxy服务

    1. #将node01节点的kubelet.sh、proxy.sh文件复制到node02节点
    2. [root@node01 opt]# scp kubelet.sh proxy.sh root@192.168.247.40:/opt/
    3. #node02上启动kubelet服务
    4. [root@node02 opt]# ./kubelet.sh 192.168.247.40
    5. #启动proxy服务
    6. [root@node02 opt]# ./proxy.sh 192.168.247.40
    7. [root@node02 opt]# ps -aux |grep kube-proxy
    1. 在 node02 节点上操作
    2. #加载 ip_vs 模块
    3. for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done

    1. kubectl get csr
    2. #检查到 node02 节点的 kubelet 发起的 CSR 请求,Pending 表示等待集群给该节点签发证书
    3. kubectl certificate approve 【node-csr-duiobEzQ0R93HsULoS9NT9JaQylMmid_nBF3Ei3NtFE(这里面的根据实际的来)】
    4. #通过CSR请求
    5. kubectl get csr
    6. #Approved,Issued 表示已授权 CSR 请求并签发证书
    7. kubectl get node
    8. #查看节点,由于网络插件还没有部署,节点会没有准备就绪,就会显示NotReady

    七、部署CNI网络组建

    K8s的三种网络模式:

    1. Pod网络:在这种模式下,每个 Pod 都拥有独立的 IP 地址。并且可以通过容器之间直接访问。这种模式通常使用 Linux Bridge 网桥实现。
    2. Service网络:service是一个虚拟IP,是一个负载均衡集群IP,这种模式使用 Kubernetes Service 来公开应用程序服务,并为它们提供稳定的虚拟 IP 地址。
    3. 节点网络:CNI 模式通常通过 CNI 插件来管理容器网络。
    • Pod 内容器与容器之间的通信:用 localhost 地址访问彼此的端口。
    • 同一个 Node 内 Pod 之间的通信:每个 Pod 都有一个真实的全局 IP 地址,可以直接采用对方 Pod 的 IP 地址进行通信,Pod1 与 Pod2 都是通过 Veth 连接到同一个 docker0/cni0 网桥,网段相同,所以它们之间可以直接通信。
    • 不同 Node 上 Pod 之间的通信:
       

    Flannel UDP 模式的工作原理:

    数据从主机 A 上 Pod 的源容器中发出后,经由所在主机的 docker0/cni0 网络接口转发到 flannel0 接口,flanneld 服务监听在 flannel0 虚拟网卡的另外一端。
    Flannel 通过 Etcd 服务维护了一张节点间的路由表。源主机 A 的 flanneld 服务将原本的数据内容封装到 UDP 报文中, 根据自己的路由表通过物理网卡投递给目的节点主机 B 的 flanneld 服务,数据到达以后被解包,然后直接进入目的节点的 flannel0 接口, 之后被转发到目的主机的 docker0/cni0 网桥,最后就像本机容器通信一样由 docker0/cni0 转发到目标容器。

    Flannel VXLAN 模式跨主机的工作原理:

    1、数据帧从主机 A 上 Pod 的源容器中发出后,经由所在主机的 docker0/cni0 网络接口转发到 flannel.1 接口
    2、flannel.1 收到数据帧后添加 VXLAN 头部,封装在 UDP 报文中
    3、主机 A 通过物理网卡发送封包到主机 B 的物理网卡中
    4、主机 B 的物理网卡再通过 VXLAN 默认端口 4789 转发到 flannel.1 接口进行解封装
    5、解封装以后,内核将数据帧发送到 cni0,最后由 cni0 发送到桥接到此接口的容器 B 中。

    1、部署flannel

    在node01节点上操作

    1. cd /opt/k8s-cert
    2. #上传 cni-plugins-linux-amd64-v0.8.6.tgz 和 flannel.tar 到 /opt 目录中
    3. //一个为cni的各种执行文件,一个为docker镜像
    4. docker load -i flannel.tar
    5. #将镜像上传到容器本地中
    6. mkdir -p /opt/cni/bin
    7. #创建一个存放cni插件的执行工作目录
    8. tar zxvf cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni/bin
    9. #将有压缩包解压到cni的工作目录

    在master01节点上操作

    1. cd /opt/k8s/k8s-cert
    2. #上传 kube-flannel.yml 文件到 /opt/k8s 目录中,部署 CNI 网络
    3. kubectl apply -f kube-flannel.yml
    4. #基于yml文件创建pod。
    5. kubectl get pods -n kube-system
    6. #查看此pod是否正常运行(runing即可)
    7. kubectl get nodes
    8. #再次查看node节点的状态是否为就绪状态(ready即可)
    9. ------------------------------------------------------------
    10. 此步骤如果pod一直无法变成runing状态
    11. 可以使用 kubectl delete -f kube-flannel.yml #删除然后重新创建,大部分原因是镜像问题,需要重新下

    2、部署calico

    k8s 组网方案对比(flannel与calico对比):

    flannel

    配置方便、功能简单,是基于ouverlay叠加实现网络,由于要进行封装和解封装的过程,对性能会有一定的影响,同时不具备网络策略配置能力

    三种网络模式:UDP VXLAN HOST-GW 默认网段:10.244.0.0/16

    calico

    功能强大,没有封装和解封装的过程,对性能影响比较小,具有网络策略配置能力,但是路由表维护起来比较复杂。默认网段:192.168.0.0/16 模式:BGP

    Calico 主要由三个部分组成:

    • Calico CNI插件:主要负责与kubernetes对接,供kubelet调用使用。
    • Felix:负责维护宿主机上的路由规则、FIB转发信息库等。
    • BIRD:负责分发路由规则,类似路由器。
    • Confd:配置管理组件。

    Calico 工作原理:

    Calico 是通过路由表来维护每个 pod 的通信。Calico 的 CNI 插件会为每个容器设置一个 veth pair 设备, 然后把另一端接入到宿主机网络空间,由于没有网桥,CNI 插件还需要在宿主机上为每个容器的 veth pair 设备配置一条路由规则, 用于接收传入的 IP 包。
    有了这样的 veth pair 设备以后,容器发出的 IP 包就会通过 veth pair 设备到达宿主机,然后宿主机根据路由规则的下一跳地址, 发送给正确的网关,然后到达目标宿主机,再到达目标容器。
    这些路由规则都是 Felix 维护配置的,而路由信息则是 Calico BIRD 组件基于 BGP 分发而来。
    calico 实际上是将集群里所有的节点都当做边界路由器来处理,他们一起组成了一个全互联的网络,彼此之间通过 BGP 交换路由, 这些节点我们叫做 BGP Peer。
     

    1. cd /opt/k8s/k8s-cert/
    2. #上传 calico.yaml 文件到 /opt/k8s 目录中,部署 CNI 网络
    3. vim calico.yaml
    4. //修改里面定义 Pod 的网络(CALICO_IPV4POOL_CIDR),需与前面 kube-controller-manager 配置文件指定的 cluster-cidr 网段一样
    5. - name: CALICO_IPV4POOL_CIDR
    6. value: "10.244.0.0/16" #(3878行)Calico 默认使用的网段为 192.168.0.0/16
    7. kubectl apply -f calico.yaml
    8. #基于calico.yml文件创建pod
    9. kubectl get pods -n kube-system
    10. #查看状态
    11. kubectl get nodes
    12. ##等 Calico Pod 都 Running,节点也会准备就绪
    13. --------------------------------------------------------------
    14. 此步骤如果pod一直无法变成runing状态
    15. 可以使用 kubectl delete -f calico.yml #删除然后重新创建,大部分原因是镜像问题,需要重新下

    3、node02节点部署

    • 在 node01 节点上操作
    1. cd /opt/k8s-cert/
    2. scp kubelet.sh proxy.sh root@192.168.27.40:/opt/
    3. #将node01上面的两个组件的安装脚本拷贝到node02上面进行安装组件
    4. scp -r /opt/cni root@192.168.247.40:/opt/
    5. #将node01的cni里面的插件拷贝到node02上面
    • 在 node02节点上操作
    1. cd /opt/
    2. chmod +x kubelet.sh
    3. ./kubelet.sh 192.168.247.40
    4. #执行kubelet.sh脚本,带入本机的IP地址,进行安装kubelet组件,这里也是相当于申请了CSR认证,需要在master01上进行认证。
    5. systemctl status kubelet
    6. #查看kube组件是否启动
    • 在master01节点上操作
    1. kubectl get csr
    2. kubectl certificate approve 【node-csr-BbqEh6LvhD4R6YdDUeEPthkb6T_CJDcpVsmdvnh81y0】
    3. #通过请求(两台都要通过,前面node01的已经通过)
    4. kubectl get csr
    • 在node02 节点操作
    1. for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done
    2. #使用for循环,加载 ipvs 模块
    3. cd /opt
    4. chmod +x proxy.sh
    5. ./proxy.sh 192.168.247.40
    6. ##使用proxy.sh脚本启动proxy服务,位置变量为本机IP地址。
    7. systemctl status kube-proxy
    8. #查看kube-proxy组件服务是否启动
    • 在master节点操作
    1. kubectl get nodes
    2. #查看群集中的节点状态
    3. kubectl get pods -n kube-system
    4. #需要等里面的几个pod都启动起来,变成running(显示init可以稍微等下,或者PodInitializing,如果显示pullimage失败,可以安装上述办法重新创建)

     八、部署core DNS

    CoreDNS:可以为集群中的 service 资源创建一个域名 与 IP 的对应关系解析

    • 在所有node节点上操作
    1. cd /opt/
    2. #上传coredns.tar 到/opt目录上
    3. docker load -i coredns.tar
    4. #上传到docker中
    • 在master01 节点上操作
    1. cd /opt/k8s
    2. #上传 coredns.yaml 文件到 /opt/k8s 目录中,部署 CoreDNS
    3. kubectl apply -f coredns.yaml
    4. #根据coredns.yml文件创建pod
    5. kubectl get pods -n kube-system
    6. #再次查看创建的dns的pod是否运行成功
    7. #DNS 解析测试
    8. kubectl run -it --rm dns-test --image=busybox:1.28.4 sh
    9. #运行一个容器,镜像为busybos:1.28.4,并且直接运行(网不好就多等会),然后解析kubernetes成功即可
    10. If you don't see a command prompt, try pressing enter.
    11. / # nslookup kubernetes
    12. Server: 10.0.0.2
    13. Address 1: 10.0.0.2 kube-dns.kube-system.svc.cluster.local
    14. Name: kubernetes
    15. Address 1: 10.0.0.1 kubernetes.default.svc.cluster.local
    16. #出现上述即测试成功

    注:

    如果出现以下报错

    1. [root@master01 k8s]# kubectl run -it --image=busybox:1.28.4 sh
    2. If you don't see a command prompt, try pressing enter.
    3. Error attaching, falling back to logs: unable to upgrade connection: Forbidden (user=system:anonymous, verb=create, resource=nodes, subresource=proxy)
    4. Error from server (Forbidden): Forbidden (user=system:anonymous, verb=get, resource=nodes, subresource=proxy) ( pods/log sh)
    5. 需要添加 rbac的权限 直接使用kubectl绑定 clusteradmin 管理员集群角色 授权操作权限
    6. [root@master01 k8s]# kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous
    7. clusterrolebinding.rbac.authorization.k8s.io/cluster-system-anonymous created

     九、master02 节点部署

    需要安装步骤一的系统初始化脚本,并且更名为master02

    • 在master01上操作
    1. scp -r /opt/etcd/ root@192.168.247.20:/opt/
    2. #拷贝matser01上面的etcd证书到master02上面
    3. scp -r /opt/kubernetes/ root@192.168.247.20:/opt
    4. #拷贝master01上的整个kubernetes工作目录
    5. scp -r /root/.kube root@192.168.247.20:/root
    6. #拷贝运行master01上面的.kube运行文件kubect命令文件到master02上面
    7. scp /usr/lib/systemd/system/{kube-apiserver,kube-controller-manager,kube-scheduler}.service root@192.168.247.20:/usr/lib/systemd/system/
    8. #从 master01 节点上拷贝三大组件到master02上面

    master02节点修改

    1. vim /opt/kubernetes/cfg/kube-apiserver
    2. KUBE_APISERVER_OPTS="--logtostderr=true \
    3. --v=4 \
    4. --etcd-servers=https://192.168.247.10:2379,https://192.168.247.30:2379,https://192.168.247.40:2379 \
    5. --bind-address=192.168.247.20 \ #修改
    6. --secure-port=6443 \
    7. --advertise-address=192.168.247.20 \ #修改
    8. ......
    9. ###修改apiserver组件指向的IP地址,修改监听地址为本即IP地址
    1. systemctl start kube-apiserver.service
    2. systemctl enable kube-apiserver.service
    3. systemctl start kube-controller-manager.service
    4. systemctl enable kube-controller-manager.service
    5. systemctl start kube-scheduler.service
    6. systemctl enable kube-scheduler.service
    7. #在 master02 节点上启动各服务并设置开机自启
    8. ln -s /opt/kubernetes/bin/* /usr/local/bin/
    9. kubectl get nodes
    10. kubectl get nodes -o wide #-o=wide:输出额外信息;对于Pod,将输出Pod所在的Node名
    11. ##此时在master02节点查到的node节点状态仅是从etcd查询到的信息,而此时node节点实际上并未与master02节点建立通信连接,因此需要使用一个VIP把node节点与master节点都关联起来

    至此,以上的两主两从,已安装完成,下面将配置负载均衡,通过nginx将负载均衡到两台master主机上。

    十、负载均衡部署(lb01、lb02)

    1、部署nginx服务、配置四层负载均衡

    1. systemctl stop firewalld
    2. systemctl disable firewalld
    3. setenforce 0
    4. #关闭防火墙
    5. cat > /etc/yum.repos.d/nginx.repo << 'EOF'
    6. [nginx]
    7. name=nginx repo
    8. baseurl=http://nginx.org/packages/centos/7/$basearch/
    9. gpgcheck=0
    10. EOF
    11. #配置nginx的官方在线源,配置本地nginx的yum源
    12. yum -y install nginx
    13. #下载nginx
    14. -----#修改nginx配置文件,配置四层反向代理负载均衡,指定k8s群集2台master的节点ip和6443端口-----
    15. vim /etc/nginx/nginx.conf
    16. events {
    17. worker_connections 1024;
    18. }
    19. #添加
    20. stream {
    21. log_format main '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';
    22. access_log /var/log/nginx/k8s-access.log main;
    23. upstream k8s-apiserver {
    24. server 192.168.247.50:6443;
    25. server 192.168.247.60:6443;
    26. }
    27. server {
    28. listen 6443;
    29. proxy_pass k8s-apiserver;
    30. }
    31. }
    32. http {
    33. ......
    34. ---------------------------------------------------------------------
    35. nginx -t
    36. #检查语法
    37. systemctl start nginx.service
    38. systemctl enable nginx.service
    39. netstat -natp |grep nginx
    40. #启动nginx服务,查看自己的监听6443端口
    • 创建nginx状态检查脚本

    1. vim /etc/nginx/check_nginx.sh
    2. #!/bin/bash
    3. #egrep -cv "grep|$$" 用于过滤掉包含grep 或者 $$ 表示的当前Shell进程ID,即脚本运行的当前进程ID号
    4. count=$(ps -ef | grep nginx | egrep -cv "grep|$$")
    5. if [ "$count" -eq 0 ];then
    6. systemctl stop keepalived
    7. fi
    8. chmod +x /etc/nginx/check_nginx.sh

    2、部署keepalived服务

    1. yum install keepalived -y
    2. #下载keepalived服务
    3. #修改配置文件
    4. vim /etc/keepalived/keepalived.conf
    5. ! Configuration File for keepalived
    6. global_defs {
    7. # 接收邮件地址
    8. notification_email {
    9. acassen@firewall.loc
    10. failover@firewall.loc
    11. sysadmin@firewall.loc
    12. }
    13. # 邮件发送地址
    14. notification_email_from Alexandre.Cassen@firewall.loc
    15. smtp_server 127.0.0.1
    16. smtp_connect_timeout 30
    17. router_id NGINX_MASTER #lb01节点的为 NGINX_MASTER,lb02节点的为 NGINX_BACKUP
    18. }
    19. #添加一个周期性执行的脚本
    20. vrrp_script check_nginx {
    21. script "/etc/nginx/check_nginx.sh" #指定检查nginx存活的脚本路径
    22. }
    23. vrrp_instance VI_1 {
    24. state MASTER #lb01节点的为 MASTER,lb02节点的为 BACKUP
    25. interface ens33 #指定网卡名称 ens33
    26. virtual_router_id 51 #指定vrid,两个节点要一致
    27. priority 100 #lb01节点的为 100,lb02节点的为 90
    28. advert_int 1
    29. authentication {
    30. auth_type PASS
    31. auth_pass 1111
    32. }
    33. virtual_ipaddress {
    34. 192.168.247.100/24 #指定 VIP
    35. }
    36. track_script {
    37. check_nginx #指定vrrp_script配置的脚本
    38. }
    39. }
    • 启动keepalived服务(一定要先启动了nginx服务,再启动keepalived服务)
    1. systemctl start keepalived
    2. systemctl enable keepalived
    3. ip a #查看VIP是否生成
    • 修改node节点上的bootstrap.kubeconfig,kubelet.kubeconfig配置文件为VIP
    1. cd /opt/kubernetes/cfg/
    2. vim bootstrap.kubeconfig
    3. server: https://192.168.10.100:6443
    4. vim kubelet.kubeconfig
    5. server: https://192.168.10.100:6443
    6. vim kube-proxy.kubeconfig
    7. server: https://192.168.10.100:6443
    8. //重启kubelet和kube-proxy服务
    9. systemctl restart kubelet.service
    10. systemctl restart kube-proxy.service
    • 在 lb01 上查看 nginx 和 node 、 master 节点的连接状态
    1. netstat -natp | grep nginx
    2. tcp 0 0 0.0.0.0:6443 0.0.0.0:* LISTEN 84739/nginx: master
    3. tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 84739/nginx: master
    4. tcp 0 0 192.168.10.21:60382 192.168.10.20:6443 ESTABLISHED 84741/nginx: worker
    5. tcp 0 0 192.168.10.100:6443 192.168.10.18:41650 ESTABLISHED 84741/nginx: worker
    6. tcp 0 0 192.168.10.100:6443 192.168.10.19:49726 ESTABLISHED 84741/nginx: worker
    7. tcp 0 0 192.168.10.21:35234 192.168.10.80:6443 ESTABLISHED 84741/nginx: worker
    8. tcp 0 0 192.168.10.100:6443 192.168.10.18:41648 ESTABLISHED 84741/nginx: worker
    9. tcp 0 0 192.168.10.100:6443 192.168.10.19:49728 ESTABLISHED 84742/nginx: worker
    10. tcp 0 0 192.168.10.100:6443 192.168.10.18:41646 ESTABLISHED 84741/nginx: worker
    11. tcp 0 0 192.168.10.21:32786 192.168.10.20:6443 ESTABLISHED 84741/nginx: worker
    12. tcp 0 0 192.168.10.100:6443 192.168.10.18:41656 ESTABLISHED 84741/nginx: worker
    13. tcp 0 0 192.168.10.21:60378 192.168.10.20:6443 ESTABLISHED 84741/nginx: worker
    14. tcp 0 0 192.168.10.21:32794 192.168.10.20:6443 ESTABLISHED 84741/nginx: worker
    15. tcp 0 0 192.168.10.100:6443 192.168.10.19:49724 ESTABLISHED 84741/nginx: worker
    16. tcp 0 0 192.168.10.21:35886 192.168.10.80:6443 ESTABLISHED 84741/nginx: worker
    17. tcp 0 0 192.168.10.100:6443 192.168.10.19:51372 ESTABLISHED 84742/nginx: worker
    18. tcp 0 0 192.168.10.100:6443 192.168.10.19:49722 ESTABLISHED 84741/nginx: worker
    19. tcp 0 0 192.168.10.100:6443 192.168.10.19:49702 ESTABLISHED 84741/nginx: worker
    • 在 master01 节点上操作
    1. //测试创建pod
    2. kubectl run nginx --image=nginx
    3. //查看Pod的状态信息
    4. kubectl get pods
    5. NAME READY STATUS RESTARTS AGE
    6. nginx-dbddb74b8-nf9sk 0/1 ContainerCreating 0 33s #正在创建中
    7. kubectl get pods
    8. NAME READY STATUS RESTARTS AGE
    9. nginx-dbddb74b8-nf9sk 1/1 Running 0 80s #创建完成,运行中
    10. kubectl get pods -o wide
    11. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
    12. nginx-dbddb74b8-26r9l 1/1 Running 0 10m 172.17.36.2 192.168.80.15
    13. //READY为1/1,表示这个Pod中有1个容器
    • 在对应网段的node节点上操作,可以直接使用浏览器或者curl命令访问
    curl 172.17.36.2
    
    •  这时在master01节点上查看nginx日志
    kubectl logs nginx-dbddb74b8-nf9sk
    

    十一、部署Dashboard(master01)

    Dashboard 介绍
    仪表板是基于Web的Kubernetes用户界面。您可以使用仪表板将容器化应用程序部署到Kubernetes集群,对容器化应用程序进行故障排除,并管理集群本身及其伴随资源。您可以使用仪表板来概述群集上运行的应用程序,以及创建或修改单个Kubernetes资源(例如deployment,job,daemonset等)。例如,您可以使用部署向导扩展部署,启动滚动更新,重新启动Pod或部署新应用程序。仪表板还提供有关群集中Kubernetes资源状态以及可能发生的任何错误的信息。

    上传文件并进行暴露端口

    1. cd /opt/k8s/k8s-cert/
    2. #上传 recommended.yaml 文件到 /opt/k8s 目录中
    3. ------------------------------------------------------------
    4. vim recommended.yaml
    5. #默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部:
    6. kind: Service
    7. apiVersion: v1
    8. metadata:
    9. labels:
    10. k8s-app: kubernetes-dashboard
    11. name: kubernetes-dashboard
    12. namespace: kubernetes-dashboard
    13. spec:
    14. ports:
    15. - port: 443
    16. targetPort: 8443
    17. nodePort: 30001 #添加
    18. type: NodePort #添加
    19. selector:
    20. k8s-app: kubernetes-dashboard
    21. ------------------------------------------------------------------
    22. kubectl apply -f recommended.yaml
    23. #基于yml文件创建pod
    24. kubectl get pods -n kubernetes-dashboard
    25. #查看是否创建成功

    创建service account并绑定默认cluster-admin管理员集群角色

    1. kubectl create serviceaccount dashboard-admin -n kube-system
    2. #创建资源,并指定账号
    3. kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
    4. #
    5. kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
    6. #查看信息
    7. eyJhbGciOiJSUzI1NiIsImtpZCI6ImRyOUpLNnZNaUxfbHAySGpiV0xKdHlZaTJGU192V3VUX2RieXdqT1RRb2MifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tOWNodjciLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiZTE2ZWIwYzUtMDg2NC00MGIyLTg4MzAtZjAyODYxOTQxMTFiIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.HV7CM-5NFqzz99250Pou_qXrpDdzNbA7kUmYnl3gdcXHSLeUpAQXbrEH_JEkS5LTwp62Q_QCZlrYkO_wKXIzUpQI9_3Th3zZUec76SWlIVXf6rqEh2VZj45jdYXVqpZzwhI-FJ6NQ5H5sIxOQlyP1wKqwtb8XNB6Oj2uQsWEHuJFnKfm7wzF5n8-4WKQ0RVHWPcrCkScgY_POYv1utK55kVgrPk2dFH97eUDOuOv7ZaqiYJqupOluRpoVAqeks0z0i4BZNoZL_nxvuRlN-KBvuTkeWrr5Fb3WyI-BUZNurYFuIDhM6vNjSHuDyTQL2LQbkK2DRPepBFbniZWjMiu-w

    最后网页进行登录

    https://NodeIP:30001

    例子:https://192.168.247.30:30001

  • 相关阅读:
    【Java】从源码分析fail-fast和fail-safe是如何产生的
    go-webSocket——gorilla
    汇编语言中断及外部设备操作篇--06
    1-k8s集群安装报错CGROUPS_CPU: missing
    学编程:Python入门考级必备[7]
    艾美捷Enzo人 IgG1 同种型对照化学参数及文献参考
    VR社交应用Rec Room再获1.45亿美元融资,用户突破3700万
    http中的Content-Type类型
    接口测试经验分享
    tensorflow内存泄漏或模型只加载不运行
  • 原文地址:https://blog.csdn.net/weixin_46254171/article/details/133926396