赞
踩
需要三台设备:一台master,两台node,etcd安装在node里
master/node:192.168.116.21
node01:192.168.116.22
node02:192.168.116.23
关闭防火墙
- systemctl stop firewalld
- systemctl disable firewalld
- iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
关闭selinux
- setenforce 0
- sed -i 's/enforcing/disabled/' /etc/selinux/config
关闭swap
- swapoff -a
- sed -ri 's/.*swap.*/#&/' /etc/fstab
根据规划设置主机名
- hostnamectl set-hostname master01
- hostnamectl set-hostname node01
- hostnamectl set-hostname node02
在master添加hosts
- cat >> /etc/hosts << EOF
- 192.168.116.21 master01
- 192.168.116.22 node01
- 192.168.116.23 node02
- EOF
调整内核参数
- cat > /etc/sysctl.d/k8s.conf << EOF
- #开启网桥模式,可将网桥的流量传递给iptables链
- net.bridge.bridge-nf-call-ip6tables = 1
- net.bridge.bridge-nf-call-iptables = 1
- #关闭ipv6协议
- net.ipv6.conf.all.disable_ipv6=1
- net.ipv4.ip_forward=1
- EOF
-
- sysctl --system
时间同步
- yum install ntpdate -y
- ntpdate time.windows.com
- yum install -y yum-utils device-mapper-persistent-data lvm2
-
- yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-
- yum install -y docker-ce docker-ce-cli containerd.io
-
- systemctl start docker.service
-
- systemctl enable docker.service
- docker info
- 查看默认存储引擎是cgroupfs引擎
添加一个.json结尾的配置文件
- cd /etc/docker
- vim daemon.json
- {
- "registry-mirrors":["https://6ijb8ubo.mirror.aliyuncs.com"],
- "exec-opts":["native.cgroupdriver=systemd"],
- "log-dirver": "json-file",
- "log-opts": {
- "max-size":"500m","max-file": "3"
- }
- }
- ---------------------------------------------------------------------------
-
- 仓库镜像地址
- "registry-mirrors":["https://6ijb8ubo.mirror.aliyuncs.com"]
-
- 设置cgroup引擎为systemd
- "exec-opts":["native.cgroupdriver=systemd"],
-
- 日志的配置
- "log-dirver": "json-file",
- "log-opts": {
- "max-size":"500m","max-file": "3"
-
- cat > /etc/docker/daemon.json <<EOF
- {
- "registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],
- "exec-opts": ["native.cgroupdriver=systemd"],
- "log-driver":"json-file",
- "log-opts":{
- "max-size":"500m","max-file":"3"
- }
- }
- EOF
- systemctl restart docker.service
- #再查看引擎是否更改
- docker info | grep "Cgroup Driver"
- Cgroup Driver: systemd
etcd 目前默认使用2379端口提供HTTP API服务, 2380端口和peer通信
etcd 在生产环境中一般推荐集群方式部署。由于etcd 的leader选举机制,要求至少为3台或以上的奇数台。
特性 | 说明 |
---|---|
分布式存储 | etcd的数据存储式分布式的,可以跨多个节点进行分布,确保高可用性和可扩展性 |
强制性 | etcd提供强一致性的保证,确保在集群中的所有节点都能看到相同的数据视图 |
轻量级 | etcd采用轻量级的raft算法,确保集群中的节点之间达成一致 |
API支持 | etcd提供简单而强大的HTTP+JSON API,使开发人员可以轻松的与其进行交互,并集成到各种应用和工具中。 |
监听机制(watch机制) | etcd支持监听机制,允许客户监视特定键的变化,并在数据发生变更时得到通知。 |
安全性 | etcd支持SSL/TLS加密。以保障数据在传输过程中的安全性,并提供基于角色的访问控制。 |
CFSSL 使用配置文件生成证书,因此自签之前,需要生成它识别的 json 格式的配置文件,CFSSL 提供了方便的命令行生成配置文件。
CFSSL 用来为 etcd 提供 TLS 证书,它支持签三种类型的证书:
证书 | 说明 |
---|---|
客户端证书(client 证书) | 服务端连接客户端时携带的证书,用于客户端验证服务端身份,如 kube-apiserver 访问 etcd |
服务端证书(server 证书) | 客户端连接服务端时携带的证书,用于服务端验证客户端身份,如 etcd 对外提供服务 |
peer 证书 | 集群内相互之间连接时使用的证书,如 etcd 节点之间进行验证和通信。 |
以上是安全级别最高的情况下所使用的三套安全证书。
这里全部都使用同一套证书认证。
- 准备cfssl证书生成工具
- wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/local/bin/cfssl
- wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O /usr/local/bin/cfssljson
- wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -O /usr/local/bin/cfssl-certinfo
-
- -----------------------------------------------------------------------------------------
- cfssl:证书签发的工具命令
- cfssljson:将 cfssl 生成的证书(默认为json格式)转化为文件承载式证书
- cfssl-certinfo:验证证书的信息
-
- #查看证书的信息
- cfssl-certinfo -cert <证书名称>
- #将文件传入到/usr/local/bin目录下
- cd /usr/local/bin
- #给他们可执行的权限
- chmod +x /usr/local/bin/cfssl*
cfssl version #检查版本
- 将master和node节点的/opt目录下所有的文件清空
- 在master节点上创建一个k8s的安装目录
- mkdir k8s
- 进入目录中上传两个etcd的脚本文件
- etcd-cert.sh生成证书和私钥的文件
- etcd.sh启动etcd服务的脚本文件
- vim etcd-cert.sh
-
- #!/bin/bash
- #配置证书生成策略,让 CA 软件知道颁发有什么功能的证书,生成用来签发其他组件证书的根证书
- cat > ca-config.json <<EOF
- {
- "signing": {
- "default": {
- "expiry": "87600h"
- },
- "profiles": {
- "www": {
- "expiry": "87600h",
- "usages": [
- "signing",
- "key encipherment",
- "server auth",
- "client auth"
- ]
- }
- }
- }
- }
- EOF
-
- #ca-config.json:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;
- #后续在签名证书时会使用某个 profile;此实例只有一个 www 模板。
- #expiry:指定了证书的有效期,87600h 为10年,如果用默认值一年的话,证书到期后集群会立即宕掉
- #signing:表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;
- #key encipherment:表示使用非对称密钥加密,如 RSA 加密;
- #server auth:表示client可以用该 CA 对 server 提供的证书进行验证;
- #client auth:表示server可以用该 CA 对 client 提供的证书进行验证;
- #注意标点符号,最后一个字段一般是没有逗号的。
-
-
- #-----------------------
- #生成CA证书和私钥(根证书和私钥)
- #特别说明: cfssl和openssl有一些区别,openssl需要先生成私钥,然后用私钥生成请求文件,最后生成签名的证书和私钥等,但是cfssl可以直接得到请求文件。
- cat > ca-csr.json <<EOF
- {
- "CN": "etcd",
- "key": {
- "algo": "rsa",
- "size": 2048
- },
- "names": [
- {
- "C": "CN",
- "L": "Beijing",
- "ST": "Beijing"
- }
- ]
- }
- EOF
-
- #CN:Common Name,浏览器使用该字段验证网站或机构是否合法,一般写的是域名
- #key:指定了加密算法,一般使用rsa(size:2048)
- #C:Country,国家
- #ST:State,州,省
- #L:Locality,地区,城市
- #O: Organization Name,组织名称,公司名称
- #OU: Organization Unit Name,组织单位名称,公司部门
-
- cfssl gencert -initca ca-csr.json | cfssljson -bare ca
-
- #生成的文件:
- #ca-key.pem:根证书私钥
- #ca.pem:根证书
- #ca.csr:根证书签发请求文件
-
- #cfssl gencert -initca <CSRJSON>:使用 CSRJSON 文件生成新的证书和私钥。如果不添加管道符号,会直接把所有证书内容输出到屏幕。
- #注意:CSRJSON 文件用的是相对路径,所以 cfssl 的时候需要 csr 文件的路径下执行,也可以指定为绝对路径。
- #cfssljson 将 cfssl 生成的证书(json格式)变为文件承载式证书,-bare 用于命名生成的证书文件。
-
-
- #-----------------------
- #生成 etcd 服务器证书和私钥
- cat > server-csr.json <<EOF
- {
- "CN": "etcd",
- "hosts": [
- "192.168.116.21",
- "192.168.116.22",
- "192.168.116.23"
- ],
- "key": {
- "algo": "rsa",
- "size": 2048
- },
- "names": [
- {
- "C": "CN",
- "L": "BeiJing",
- "ST": "BeiJing"
- }
- ]
- }
- EOF
-
- #hosts:将所有 etcd 集群节点添加到 host 列表,需要指定所有 etcd 集群的节点 ip 或主机名不能使用网段,新增 etcd 服务器需要重新签发证书。
-
- cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server
-
- #生成的文件:
- #server.csr:服务器的证书请求文件
- #server-key.pem:服务器的私钥
- #server.pem:服务器的数字签名证书
-
- #-config:引用证书生成策略文件 ca-config.json
- #-profile:指定证书生成策略文件中的的使用场景,比如 ca-config.json 中的 www
- vim etcd.sh
-
- #!/bin/bash
- #example: ./etcd.sh etcd01 192.168.116.21 etcd02=https://192.168.116.22:2380,etcd03=https://192.168.116.23:2380
-
- #创建etcd配置文件/opt/etcd/cfg/etcd
- ETCD_NAME=$1
- ETCD_IP=$2
- ETCD_CLUSTER=$3
-
- WORK_DIR=/opt/etcd
-
- cat > $WORK_DIR/cfg/etcd <<EOF
- #[Member]
- ETCD_NAME="${ETCD_NAME}"
- ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
- ETCD_LISTEN_PEER_URLS="https://${ETCD_IP}:2380"
- ETCD_LISTEN_CLIENT_URLS="https://${ETCD_IP}:2379"
- #[Clustering]
- ETCD_INITIAL_ADVERTISE_PEER_URLS="https://${ETCD_IP}:2380"
- ETCD_ADVERTISE_CLIENT_URLS="https://${ETCD_IP}:2379"
- ETCD_INITIAL_CLUSTER="etcd01=https://${ETCD_IP}:2380,${ETCD_CLUSTER}"
- ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
- ETCD_INITIAL_CLUSTER_STATE="new"
- EOF
-
- #Member:成员配置
- #ETCD_NAME:节点名称,集群中唯一。成员名字,集群中必须具备唯一性,如etcd01
- #ETCD_DATA_DIR:数据目录。指定节点的数据存储目录,这些数据包括节点ID,集群ID,集群初始化配置,Snapshot文件,若未指定-wal-dir,还会存储WAL文件;如果不指定会用缺省目录
- #ETCD_LISTEN_PEER_URLS:集群通信监听地址。用于监听其他member发送信息的地址。ip为全0代表监听本机所有接口
- #ETCD_LISTEN_CLIENT_URLS:客户端访问监听地址。用于监听etcd客户发送信息的地址。ip为全0代表监听本机所有接口
-
- #Clustering:集群配置
- #ETCD_INITIAL_ADVERTISE_PEER_URLS:集群通告地址。其他member使用,其他member通过该地址与本member交互信息。一定要保证从其他member能可访问该地址。静态配置方式下,该参数的value一定要同时在--initial-cluster参数中存在
- #ETCD_ADVERTISE_CLIENT_URLS:客户端通告地址。etcd客户端使用,客户端通过该地址与本member交互信息。一定要保证从客户侧能可访问该地址
- #ETCD_INITIAL_CLUSTER:集群节点地址。本member使用。描述集群中所有节点的信息,本member根据此信息去联系其他member
- #ETCD_INITIAL_CLUSTER_TOKEN:集群Token。用于区分不同集群。本地如有多个集群要设为不同
- #ETCD_INITIAL_CLUSTER_STATE:加入集群的当前状态,new是新集群,existing表示加入已有集群。
-
-
- #创建etcd.service服务管理文件
- cat > /usr/lib/systemd/system/etcd.service <<EOF
- [Unit]
- Description=Etcd Server
- After=network.target
- After=network-online.target
- Wants=network-online.target
- [Service]
- Type=notify
- EnvironmentFile=${WORK_DIR}/cfg/etcd
- ExecStart=${WORK_DIR}/bin/etcd \
- --cert-file=${WORK_DIR}/ssl/server.pem \
- --key-file=${WORK_DIR}/ssl/server-key.pem \
- --trusted-ca-file=${WORK_DIR}/ssl/ca.pem \
- --peer-cert-file=${WORK_DIR}/ssl/server.pem \
- --peer-key-file=${WORK_DIR}/ssl/server-key.pem \
- --peer-trusted-ca-file=${WORK_DIR}/ssl/ca.pem \
- --logger=zap \
- --enable-v2
- Restart=on-failure
- LimitNOFILE=65536
- [Install]
- WantedBy=multi-user.target
- EOF
-
- #--enable-v2:开启 etcd v2 API 接口。当前 flannel 版本不支持 etcd v3 通信
- #--logger=zap:使用 zap 日志框架。zap.Logger 是go语言中相对日志库中性能最高的
- #--peer开头的配置项用于指定集群内部TLS相关证书(peer 证书),这里全部都使用同一套证书认证
- #不带--peer开头的的参数是指定 etcd 服务器TLS相关证书(server 证书),这里全部都使用同一套证书认证
-
-
- systemctl daemon-reload
- systemctl enable etcd
- systemctl restart etcd
生成CA证书、etcd 服务器证书以及私钥
- ./etcd-cert.sh
- mkdir etcd-cert
- mv ca* server* etcd-cert
- 解压
- tar xf etcd-v3.4.26-linux-amd64.tar.gz
- [root@master01 etcd-v3.4.26-linux-amd64]# ls
- Documentation etcd etcdctl README-etcdctl.md README.md READMEv2-etcdctl.md
-
-
-
- etcd是启动etcd程序进程用的
- etcdctl是etcd命令行客户端的工具
创建用于存放 etcd 配置文件,命令文件,证书的目录
- mkdir -p /opt/etcd/{cfg,bin,ssl}
-
- ----------------------------------
- cfg:存放配置文件的目录
- bin:存放命令文件的目录
- ssl:存放证书的目录
将etcd和etcdctl移动到bin目录
- mv /opt/k8s/etcd-v3.4.26-linux-amd64/etcd etcdctl /opt/etcd/bin
- 创建软连接,方便以后直接调用
- ln -s /opt/etcd/bin/* /usr/local/bin/
cp /opt/k8s/etcd-cert/*.pem /opt/etcd/ssl/
- cd /opt/k8s/
-
- ./etcd.sh etcd01 192.168.116.21 etcd02=https://192.168.116.22:2380,etcd03=https://192.168.116.23:2380
-
- 进入卡住状态等待其他节点加入,这里需要三台etcd服务同时启动,如果只启动其中一台后,服务会卡在那里,直到集群中所有etcd节点都已启动
- netstat -lntp | grep 2379
- 或
- ps -aux | grep etcd
- 或
- ps -ef | grep etcd
- scp -r /opt/etcd/ node01:/opt/
- scp -r /opt/etcd/ node02:/opt/
-
- scp /usr/lib/systemd/system/etcd.service node01:/usr/lib/systemd/system/
- scp /usr/lib/systemd/system/etcd.service node02:/usr/lib/systemd/system/
vim /opt/etcd/cfg/etcd
- 更改完之后开启etcd
-
- systemctl enable --now etcd
- netstat -lntp | grep 2379
- 成功后,这样所有的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.116.21:2379,https://192.168.116.22:2379,https://192.168.116.23:2379" endpoint health --write-out=table
-
-
-
-
-
- --cert-file:识别HTTPS端使用SSL证书文件
- --key-file:使用此SSL密钥文件标识HTTPS客户端
- --ca-file:使用此CA证书验证启用https的服务器的证书
- --endpoints:集群中以逗号分隔的机器地址列表
- cluster-health:检查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.116.21:2379,https://192.168.116.22:2379,https://192.168.116.23:2379" --write-out=table member list
上传 master.zip 和 k8s-cert.sh 到 /opt/k8s 目录中,解压 master.zip 压缩包
- cd /opt/k8s/
-
- unzip master.zip
- chmod +x *.sh
vim k8s-cert.sh
- 创建用于生成CA证书、相关组件的证书和私钥的目录
- mkdir k8s-cert
- mv k8s-cert.sh k8s-cert
- cd k8s-cert/
- chmod +x k8s-cert.sh
-
- 生成CA证书、相关组件的证书和私钥
- ./k8s-cert.sh
创建一个k8s的软件目录
- cd /opt
- mkdir kubernetes
-
- cd kubernetes/
- mkdir bin cfg ssl logs
-
-
- cp /opt/k8s/k8s-cert/*.pem /opt/kubernetes/ssl
上传二进制包
- cd /opt/k8s
-
- tar xf kubernetes-server-linux-amd64.tar.gz
复制master组件的关键命令文件到 kubernetes工作目录的 bin 子目录中
- cd /opt/k8s/kubernetes/server/bin
- cp kube-apiserver kubectl kube-controller-manager kube-scheduler /opt/kubernetes/bin/
-
- ln -s /opt/kubernetes/bin/* /usr/local/bin/
创建 bootstrap token 认证文件,apiserver 启动时会调用,然后就相当于在集群内创建了一个这个用户,接下来就可以用 RBAC 给他授权
- cd /opt/k8s/
- vim token.sh
- #!/bin/bash
- #获取随机数前16个字节内容,以十六进制格式输出,并删除其中空格
- BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ')
- #生成 token.csv 文件,按照 Token序列号,用户名,UID,用户组 的格式生成
- cat > /opt/kubernetes/cfg/token.csv <<EOF
- ${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
- EOF
-
- chmod +x token.sh
- ./token.sh
- cd /opt/k8s/
- vim apiserver.sh
- ./apiserver.sh 192.168.116.21 https://192.168.116.21:2379,https://192.168.116.22:2379,https://192.168.116.23:2379
-
-
- 检查进程是否启动成功
- ps aux | grep kube-apiserver
- cd /opt/k8s/
- vim controller-manager.sh
- ./controller-manager.sh
-
- ps aux | grep kube-controller-manager
- cd /opt/k8s/
- vim scheduler.sh
- ./scheduler.sh
- ps aux | grep kube-scheduler
- vim admin.sh
- ./admin.sh
-
- 绑定默认cluster-admin管理员集群角色,授权kubectl访问集群
- kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous
- 判断master是否正常,就用
- kubectl get cs
kubectl version
#创建kubernetes工作目录
mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
上传 node.zip 到 /opt 目录中,解压 node.zip 压缩包,获得kubelet.sh、proxy.sh
- cd /opt/
- mkdir k8s
- cd k8s
-
- 上传node.zip
- unzip node.zip
- chmod +x kubelet.sh proxy.sh
把 kubelet、kube-proxy 拷贝到 node 节点
- cd /opt/k8s/kubernetes/server/bin
- scp kubelet kube-proxy node01:/opt/kubernetes/bin/
- scp kubelet kube-proxy node02:/opt/kubernetes/bin/
上传kubeconfig.sh文件到/opt/k8s/kubeconfig目录中,生成kubelet初次加入集群引导kubeconfig文件和kube-proxy.kubeconfig文件
- mkdir /opt/k8s/kubeconfig
- cd /opt/k8s/kubeconfig
-
-
- 修改里面的配置
- vim kubeconfig.sh
- chmod +x kubeconfig.sh
-
- ./kubeconfig.sh 192.168.116.21 /opt/k8s/k8s-cert/
把配置文件 bootstrap.kubeconfig、kube-proxy.kubeconfig 拷贝到 node 节点
- scp bootstrap.kubeconfig kube-proxy.kubeconfig node01:/opt/kubernetes/cfg/
- scp bootstrap.kubeconfig kube-proxy.kubeconfig node02:/opt/kubernetes/cfg/
RBAC授权,使用户 kubelet-bootstrap 能够有权限发起 CSR 请求证书
kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
启动 kubelet 服务
- cd /opt/k8s/
- chmod +x kubelet.sh
- ./kubelet.sh 192.168.116.22
-
- 查看是否启动成功
- ps aux | grep kubelet
检查到 node01 节点的 kubelet 发起的 CSR 请求,Pending 表示等待集群给该节点签发证书
kubectl get csr
通过 CSR 请求
kubectl certificate approve node-csr-te9jUMtI8OmMwIojbc3YMMqwp8O20w1q5znPVg7kZvQ
Approved,Issued 表示已授权 CSR 请求并签发证书
查看节点,由于网络插件还没有部署,节点会没有准备就绪 NotReady
- kubectl get node
-
- 进入node节点
- 查看证书
- ls /opt/kubernetes/ssl
加载 ip_vs 模块
- cd /usr/lib/modules/3.10.0-693.el7.x86_64/kernel/net/netfilter/ipvs
-
- 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
-
- 查看模块是否加载完成
- cat /proc/net/ip_vs
启动proxy服务
- cd /opt/
- vim ./proxy.sh
-
- ./proxy.sh 192.168.80.11
- ps aux | grep kube-proxy
- cd /usr/lib/modules/3.10.0-693.el7.x86_64/kernel/net/netfilter/ipvs
-
- 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
-
- 查看模块是否加载完成
- cat /proc/net/ip_vs
-
启动kubelet
- cd /opt/k8s
-
- vim kubelet.sh
-
- ./kubelet.sh 192.168.116.23
-
-
- 进入master节点
-
- kubectl get csr
-
- kubectl certificate approve node-csr-P7dmlFvwrB_FN7_769rPTIXpt8f-LsyTmS7UMYMBKkU
-
- kubectl get csr
-
- 进入node节点
- 查看证书
- ls /opt/kubernetes/ssl
启动proxy
- cd /opt/k8s
- vim proxy.sh
-
- ./proxy.sh 192.168.116.23
- ps aux | grep proxy
-
- 进入master节点
- kubectl get nodes
目前比较常用的时flannel和calico,flannel的功能比较简单,不具备复杂的网络策略配置能力,calico是比较出色的网络管理插件,但具备复杂网络配置能力的同时,往往意味着本身的配置比较复杂,所以相对而言,比较小而简单的集群使用flannel,考虑到日后扩容,未来网络可能需要加入更多设备,配置更多网络策略,则使用calico更好。
node01 节点上操作
上传flannel软件包到/opt/k8s
- cd /opt/k8s
-
- unzip flannel-v0.21.5.zip
- docker load -i flannel-cni-plugin.tar
- docker load -i flannel.tar
- mkdir /opt/k8s/cni/bin
- tar zxvf cni-plugins-linux-amd64-v1.3.0.tgz -C /opt/cni/bin
将node01的k8s目录中的所有.tar文件包复制给node02节点里
- cd /opt/k8s
- scp *.tar 192.168.116.23:/opt/k8s
进入node02节点
- docker load -i flannel-cni-plugin.tar
- docker load -i flannel.tar
-
- docker images
再将node01的插件目录复制到node02节点中
- 进入node01
- cd /opt
- scp -r cni/ 192.168.116.23:/opt
将node01的yml文件复制到master节点中
scp kube-flannel.yml 192.168.116.21:/opt/k8s
在master执行yml文件
- kubectl apply -f kube-flannel.yml
- 会自动创建flannel所需要的资源
- 检查部署是否成功
- kubectl get pods -n kube-flannel -owide
-
- 当显示node01和node02节点都为running时,即为部署成功
-
- 此时使用kubectl get nodes查看
- 两个节点都为reday
- 此时k8s集群都为正常了
也会在每个安装了flannel插件的节点上自动生成一个flannel.1的一个接口
ifconfig
CoreDNS 是 K8S 默认的集群内部 DNS 功能实现,为 K8S 集群内的 Pod 提供 DNS 解析服务
在所有node节点上上传coredns的镜像
- cd /opt/k8s
-
- docker load -i coredns.tar
到master节点上上传配置文件
- cd /opt/k8s
-
- kubectl apply -f coredns.yaml
- 创建文件
检查coredns是否运行
kubectl get pods -n kube-system
到master节点里的配置文件中新增一台master节点地址
- cd /opt/k8s/k8s-cert
- vim k8s-cert.sh
- 关闭防火墙
- ```
- systemctl stop firewalld
- systemctl disable firewalld
- iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
- ```
-
- 关闭selinux
- ```
- setenforce 0
- sed -i 's/enforcing/disabled/' /etc/selinux/config
- ```
-
- 关闭swap
- ```
- swapoff -a
- sed -ri 's/.*swap.*/#&/' /etc/fstab
- ```
-
- 根据规划设置主机名
- ```
- hostnamectl set-hostname master02
- su
-
- ```
- 在master添加hosts
- ```
- cat >> /etc/hosts << EOF
- 192.168.116.21 master01
- 192.168.116.24 master02
- 192.168.116.22 node01
- 192.168.116.23 node02
- EOF
- 修改完之后要在所有节点里设置
- vim /etc/hosts
- 添加192.168.116.24 master02
-
-
-
- 调整内核参数
- ```
- cat > /etc/sysctl.d/k8s.conf << EOF
- #开启网桥模式,可将网桥的流量传递给iptables链
- net.bridge.bridge-nf-call-ip6tables = 1
- net.bridge.bridge-nf-call-iptables = 1
- #关闭ipv6协议
- net.ipv6.conf.all.disable_ipv6=1
- net.ipv4.ip_forward=1
- EOF
-
- sysctl --system
- ```
-
- 时间同步
- ```
- yum install ntpdate -y
- ntpdate time.windows.com
- ```
在master01的节点里把master02所需的配置文件发送过去
- cd /opt
- scp -r kubernetes/ /etcd/ master02:/opt
在master02节点里将传过去的原先的日志文件清空
- cd /opt/kubernetes/logs
- rm -rf *
-
- cd /opt/etcd
- rm -rf bin cfg
进入master01节点里将kube工具传给master02的家目录下
- cd
- scp -r .kube/ master02:/root
-
- 进入master02节点
- ls -A
- cd .kube
- rm -rf cache/
进入master01节点
- cd /usr/lib/systemd/system
- scp kube-* master02:`pwd`
-
- 进入master02节点中去查看
- ls /usr/lib/systemd/system/kube-*
修改master02启动的参数配置
- cd /opt/kubernetes/cfg
- vim kube-apiserver
vim kube-controller-manager
vim kube-scheduler
将程序都启动
- systemctl enable kube-apiserver.service --now
- systemctl enable kube-controller-manager.service --now
- systemctl enable kube-scheduler.service --now
- systemctl status kube-*
把bin目录中的二进制文件做个软连接
- ln -s /opt/kubernetes/bin/* /usr/local/bin
-
- 检查各个node节点状态
- kubectl get nodes
- kubectl get cs
进入master查看证书
- vim /opt/k8s/k8s-cert/k8s-cert.sh
-
- vip地址为192.168.116.200
- 两个负载均衡器的地址为14和15
准备好两台负载均衡,用nginx做负载均衡
- 192.168.116.14
- 192.168.116.15
-
- systemctl stop firewalld
- setenforce 0
-
- cd /etc/yum.repos.d
- 上传nginx.repo包
-
- yum install -y nginx
- systemctl enable --now nginx
- 先确认stream模块是否打开
- nginx -V
- cd /etc/nginx/
- vim nginx.conf
-
- 在http上添加四层代理转发
-
- stream {
- upstream k8s-apiservers {
- server 192.168.116.21:6443;
- server 192.168.116.24:6443;
- }
-
- server {
- listen 6443;
- proxy_pass k8s-apiservers;
- }
- }
-
-
- 检查语法结构
- nginx -t
- systemctl restart nginx
-
-
- 至此nginx负载均衡已经准备好了
两台负载均衡 准备keepalived
yum install -y keepalived.x86_64
在192.168.116.14节点准备一个脚本文件
- cd /etc/keepalived/
-
- vim check_nginx.sh
-
- #!/bin/bash
- if ! killall -0 nginx
- then
- systemctl stop keepalived
- fi
修改keepalived配置文件
- vim keepalived.conf
-
-
- ! Configuration File for keepalived
-
- global_defs {
- notification_email {
- acassen@firewall.loc
- failover@firewall.loc
- sysadmin@firewall.loc
- }
- notification_email_from Alexandre.Cassen@firewall.loc
- smtp_server 127.0.0.1
- smtp_connect_timeout 30
- router_id NGINX_01
- }
-
- vrrp_scipt check_nginx {
- interval 2
- script "/etc/keeplived/check_nginx.sh"
- }
-
- vrrp_instance VI_1 {
- state MASTER
- interface ens33
- virtual_router_id 51
- priority 100
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- virtual_ipaddress {
- 192.168.116.200
- }
- track_script {
- check_nginx
- }
- }
-
- systemctl enable --now keepalived.service
- --------------------------------------------------------------------
- 检查是否有VIP地址
- ip addr
scp * 192.168.116.15:`pwd`
然后将修改好的配置文件复制给192.168.116.15
scp * 192.168.116.15:`pwd`
进入192.168.116.15,修改keepalived.conf文件
- cd /etc/keepalived/
- vim keepalived.conf
-
-
- ! Configuration File for keepalived
-
- global_defs {
- notification_email {
- acassen@firewall.loc
- failover@firewall.loc
- sysadmin@firewall.loc
- }
- notification_email_from Alexandre.Cassen@firewall.loc
- smtp_server 127.0.0.1
- smtp_connect_timeout 30
- router_id NGINX_02
- }
-
- vrrp_scipt check_nginx {
- interval 2
- script "/etc/keeplived/check_nginx.sh"
- }
-
- vrrp_instance VI_1 {
- state BACKUP
- interface ens33
- virtual_router_id 51
- priority 90
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- virtual_ipaddress {
- 192.168.116.200
- }
- track_script {
- check_nginx
- }
- }
-
-
- systemctl enable --now keepalived.service
- cd /opt/kubernetes/cfg
- -------------------------------------------
- vim bootstrap.kubeconfig
- server: https://192.168.116.200:6443
- -------------------------------------------
- vim kube-proxy.kubeconfig
- server: https://192.168.116.200:6443
- -------------------------------------------
- vim kubelet.kubeconfig
- server: https://192.168.116.200:6443
systemctl restart kubelet.service kube-proxy.service
在负载均衡服务器上查看 nginx 和 node 、 master 节点的连接状态
netstat -natp | grep nginx
在master02上进行操作
- cd /opt/kubernetes/cfg
-
- --------------------------------------------------------------
- vim kube-scheduler.kubeconfig
- server: https://192.168.116.24:6443
- -------------------------------------------------------------
- vim kube-controller-manager.kubeconfig
- server: https://192.168.116.24:6443
-
-
- 重启服务
- systemctl restart kube-controller-manager.service kube-scheduler.service
到此k8s多Master集群已完成搭建
使用cfssl工具签发证书和私钥文件 解压etcd软件包,获取二进制文件 etcd etcdctl 准备etcd集群配置文件 启动etcd进程服务,将所有节点加入到etcd集群中
- etcd的操作:
- #查看etcd集群健康状态
- ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://IP1:2379,https://IP2:2379,https://IP3:2379" --cacert=CA证书 --cert=客户端证书 --key=客户端私钥 -wtable endpoint health
-
- #查看etcd集群状态信息
- ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://IP1:2379,https://IP2:2379,https://IP3:2379" --cacert=CA证书 --cert=客户端证书 --key=客户端私钥 -wtable endpoint status
-
- #查看etcd集群成员列表
- ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://IP1:2379,https://IP2:2379,https://IP3:2379" --cacert=CA证书 --cert=客户端证书 --key=客户端私钥 -wtable member list
-
- #向etcd插入键值
- ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://IP1:2379" --cacert=CA证书 --cert=客户端证书 --key=客户端私钥 put <KEY> '<VALUE>'
-
- #查看键的值
- ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://IP1:2379" --cacert=CA证书 --cert=客户端证书 --key=客户端私钥 get <KEY>
-
- #删除键
- ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://IP1:2379" --cacert=CA证书 --cert=客户端证书 --key=客户端私钥 del <KEY>
-
- #备份etcd数据库
- ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://IP1:2379" --cacert=CA证书 --cert=客户端证书 --key=客户端私钥 snapshot save 备份文件路径
-
- #恢复etcd数据库
- ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://IP1:2379" --cacert=CA证书 --cert=客户端证书 --key=客户端私钥 snapshot restore 备份文件路径
使用cfssl工具签发证书和私钥文件
下载K8S软件包,获取二进制文件 kube-apiserver kube-controller-manager kube-scheduler
准备 kube-apiserver 启动时要调用的 bootstrap-token 认证文件(token.csv)
准备 kube-apiserver kube-controller-manager kube-scheduler 的进程服务启动参数配置文件
准备 kube-controller-manager kube-scheduler kubectl 的 kubeconfig 集群引导配置文件(用于连接和验证 kube-apiserver)
依次启动 kube-apiserver kube-controller-manager kube-scheduler 进程服务
执行 kubectl get cs 命令查看master组件的健康状态
获取二进制文件 kubelet kube-proxy
准备 kubelet kube-proxy 使用的 kubeconfig集群引导配置文件 bootstrap.kubeconfig(kubelet首次访问apiserver使用认证的文件) kube-proxy.kubeconfig
准备 kubelet kube-proxy 的进程服务启动参数配置文件
启动 kubelet 进程服务,向 apiserver 发起 CSR 请求自动签发证书,master 通过 CSR 请求后 kubelet 即可获取到证书
加载 ipvs 模块,启动 kube-proxy 进程服务
安装 cni 网络插件(flannel或calico)和 CoreDNS
执行 kubectl get nodes 命令查看node节点状态
负责master组件相关的二进制文件、证书、私钥、启动参数配置文件、kubeconfig集群引导配置文件和etcd的证书、私钥文件
修改 kube-apiserver kube-controller-manager kube-scheduler 启动参数配置文件里的监听地址和通告地址,再依次重启服务进程
部署 nginx/haproxy 负载均衡器和 keepalived 高可用
修改 kubelet kube-proxy kubectl 的kubeconfig集群引导配置文件里的server参数都指向keepalived的VIP地址,再重启 kubelet kube-proxy 服务进程
修改其它master节点上的 kube-controller-manager kube-scheduler 的kubeconfig集群引导配置文件里的server参数都指向各自本机的apiserver地址,再重启服务进程
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。