二进制部署 Kubernetes v1.29.2 ipv4/ipv6双栈
介绍
kubernetes(k8s)二进制高可用安装部署,支持IPv4+IPv6双栈。
我使用IPV6的目的是在公网进行访问,所以我配置了IPV6静态地址。
若您没有IPV6环境,或者不想使用IPv6,不对主机进行配置IPv6地址即可。
不配置IPV6,不影响后续,不过集群依旧是支持IPv6的。为后期留有扩展可能性。
若不要IPv6 ,不给网卡配置IPv6即可,不要对IPv6相关配置删除或操作,否则会出问题。
1.环境
主机名称 | IP地址 | 说明 | 软件 |
---|---|---|---|
192.168.1.60 | 外网节点 | 下载各种所需安装包 | |
Master01 | 192.168.1.31 | master节点 | kube-apiserver、kube-controller-manager、kube-scheduler、etcd、 kubelet、kube-proxy、nfs-client、haproxy、keepalived、nginx |
Master02 | 192.168.1.32 | master节点 | kube-apiserver、kube-controller-manager、kube-scheduler、etcd、 kubelet、kube-proxy、nfs-client、haproxy、keepalived、nginx |
Master03 | 192.168.1.33 | master节点 | kube-apiserver、kube-controller-manager、kube-scheduler、etcd、 kubelet、kube-proxy、nfs-client、haproxy、keepalived、nginx |
Node01 | 192.168.1.34 | node节点 | kubelet、kube-proxy、nfs-client、nginx |
Node02 | 192.168.1.35 | node节点 | kubelet、kube-proxy、nfs-client、nginx |
192.168.1.36 | VIP |
网段
物理主机:192.168.1.0/24
service:10.96.0.0/12
pod:172.16.0.0/12
1.1.k8s基础系统环境配置
1.2.配置IP
1 | 注意! |
1.3.设置主机名
1 | hostnamectl set-hostname k8s-master01 |
1.4.配置yum源
1 | 其他系统的源地址 |
1.5.安装一些必备工具
1 | 对于 Ubuntu |
1.5.1 下载离线所需文件(可选)
在互联网服务器上安装一个一模一样的系统进行下载所需包
CentOS7
1 | 下载必要工具 |
CentOS8
1 | 下载必要工具 |
Ubuntu 下载包和依赖
1 | !/bin/bash |
1.6.选择性下载需要工具
1 | !/bin/bash |
1.7.关闭防火墙
1 | Ubuntu忽略,CentOS执行 |
1.8.关闭SELinux
1 | Ubuntu忽略,CentOS执行 |
1.9.关闭交换分区
1 | sed -ri 's/.*swap.*/#&/' /etc/fstab |
1.10.网络配置(俩种方式二选一)
1 | Ubuntu忽略,CentOS执行 |
1.11.进行时间同步
1 | 服务端 |
1.12.配置ulimit
1 | ulimit -SHn 65535 |
1.13.配置免密登录
1 | apt install -y sshpass |
1.14.添加启用源
1 | Ubuntu忽略,CentOS执行 |
1.15.升级内核至4.18版本以上
1 | Ubuntu忽略,CentOS执行 |
1.16.安装ipvsadm
1 | 对于CentOS7离线安装 |
1.17.修改内核参数
1 | cat <<EOF > /etc/sysctl.d/k8s.conf |
1.18.所有节点配置hosts本地解析
1 | cat > /etc/hosts <<EOF |
2.k8s基本组件安装
注意 : 2.1 和 2.2 二选其一即可
2.1.安装Containerd作为Runtime (推荐)
1 | https://github.com/containernetworking/plugins/releases/ |
2.1.1配置Containerd所需的模块
1 | cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf |
2.1.2加载模块
1 | systemctl restart systemd-modules-load.service |
2.1.3配置Containerd所需的内核
1 | cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf |
2.1.4创建Containerd的配置文件
1 | 参数解释: |
2.1.5启动并设置为开机启动
1 | systemctl daemon-reload |
2.1.6配置crictl客户端连接的运行时位置
1 | https://github.com/kubernetes-sigs/cri-tools/releases/ |
2.2 安装docker作为Runtime
2.2.1 解压docker程序
1 | 二进制包下载地址:https://download.docker.com/linux/static/stable/x86_64/ |
2.2.2 创建containerd的service文件
1 | 创建containerd的service文件,并且启动 |
2.2.3 准备docker的service文件
1 | 准备docker的service文件 |
2.2.4 准备docker的socket文件
1 | 准备docker的socket文件 |
2.2.5 配置加速器
1 | 配置加速器 |
2.2.6 启动docker
1 | groupadd docker |
2.2.7 解压cri-docker
1 | 由于1.24以及更高版本不支持docker所以安装cri-docker |
2.2.8 写入启动cri-docker配置文件
1 | 写入启动配置文件 |
2.2.9 写入cri-docker的socket配置文件
1 | 写入socket配置文件 |
2.2.10 启动cri-docker
1 | systemctl daemon-reload |
2.3.k8s与etcd下载及安装(仅在master01操作)
2.3.1解压k8s安装包
1 | 下载安装包 |
2.3.2查看版本
1 | [root@k8s-master01 ~]# kubelet --version |
2.3.3将组件发送至其他k8s节点
1 | Master='k8s-master02 k8s-master03' |
2.3创建证书相关文件
1 | 请查看Github仓库 或者进行获取已经打好的包 |
3.相关证书生成
1 | master01节点下载证书生成工具 |
3.1.生成etcd证书
特别说明除外,以下操作在所有master节点操作
3.1.1所有master节点创建证书存放目录
1 | mkdir /etc/etcd/ssl -p |
3.1.2master01节点生成etcd证书
1 | 写入生成证书所需的配置文件 |
3.1.3将证书复制到其他节点
1 | Master='k8s-master02 k8s-master03' |
3.2.生成k8s相关证书
特别说明除外,以下操作在所有master节点操作
3.2.1 所有k8s节点创建证书存放目录
1 | mkdir -p /etc/kubernetes/pki |
3.2.2 master01节点生成k8s证书
1 | 写入生成证书所需的配置文件 |
3.2.3 生成apiserver聚合证书
1 | cat > front-proxy-ca-csr.json << EOF |
3.2.4 生成controller-manage的证书
在《5.高可用配置》选择使用那种高可用方案
若使用 haproxy、keepalived 那么为 --server=https://192.168.1.36:9443
若使用 nginx方案,那么为 --server=https://127.0.0.1:8443
1 | cat > manager-csr.json << EOF |
3.2.5 生成kube-scheduler的证书
1 | cat > scheduler-csr.json << EOF |
3.2.6 生成admin的证书配置
1 | cat > admin-csr.json << EOF |
3.2.7 创建kube-proxy证书
在《5.高可用配置》选择使用那种高可用方案
若使用 haproxy、keepalived 那么为 --server=https://192.168.1.36:9443
若使用 nginx方案,那么为 --server=https://127.0.0.1:8443
1 | cat > kube-proxy-csr.json << EOF |
3.2.8 创建ServiceAccount Key ——secret
1 | openssl genrsa -out /etc/kubernetes/pki/sa.key 2048 |
3.2.9 将证书发送到其他master节点
1 | 其他节点创建目录 |
3.2.10 查看证书
1 | ls /etc/kubernetes/pki/ |
4.k8s系统组件配置
4.1.etcd配置
1 | 这个配置文件是用于 etcd 集群的配置,其中包含了一些重要的参数和选项: |
4.1.1master01配置
1 | 如果要用IPv6那么把IPv4地址修改为IPv6即可 |
4.1.2master02配置
1 | 如果要用IPv6那么把IPv4地址修改为IPv6即可 |
4.1.3master03配置
1 | 如果要用IPv6那么把IPv4地址修改为IPv6即可 |
4.2.创建service(所有master节点操作)
4.2.1创建etcd.service并启动
1 | cat > /usr/lib/systemd/system/etcd.service << EOF |
4.2.2创建etcd证书目录
1 | mkdir /etc/kubernetes/pki/etcd |
4.2.3查看etcd状态
1 | 如果要用IPv6那么把IPv4地址修改为IPv6即可 |
5.高可用配置(在Master服务器上操作)
注意 5.1.1 和5.1.2 二选一即可*
选择使用那种高可用方案,同时可以俩种都选用,实现内外兼顾的效果,比如:
5.1 的 NGINX方案实现集群内的高可用
5.2 的 haproxy、keepalived 方案实现集群外访问
在《3.2.生成k8s相关证书》
若使用 nginx方案,那么为 --server=https://127.0.0.1:8443
若使用 haproxy、keepalived 那么为 --server=https://192.168.1.36:9443
5.1 NGINX高可用方案
5.1.1 进行编译
1 | 安装编译环境 |
5.1.2 写入启动配置
在所有主机上执行
1 | 写入nginx配置文件 |
5.2 keepalived和haproxy 高可用方案
5.2.1安装keepalived和haproxy服务
1 | systemctl disable --now firewalld |
5.2.2修改haproxy配置文件(配置文件一样)
1 | cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak |
参数
1 | 这段配置代码是指定了一个HAProxy负载均衡器的配置。下面对各部分进行详细解释: |
5.2.3Master01配置keepalived master节点
1 | cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak |
5.2.4Master02配置keepalived backup节点
1 | cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak |
5.2.5Master03配置keepalived backup节点
1 | cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak |
参数
1 | 这是一个用于配置keepalived的配置文件。下面是对每个部分的详细解释: |
5.2.6健康检查脚本配置(lb主机)
1 | cat > /etc/keepalived/check_apiserver.sh << EOF |
5.2.7启动服务
1 | systemctl daemon-reload |
5.2.8测试高可用
1 | 能ping同 |
6.k8s组件配置
所有k8s节点创建以下目录
1 | mkdir -p /etc/kubernetes/manifests/ /etc/systemd/system/kubelet.service.d /var/lib/kubelet /var/log/kubernetes |
6.1.创建apiserver(所有master节点)
6.1.1master01节点配置
1 | cat > /usr/lib/systemd/system/kube-apiserver.service << EOF |
6.1.2master02节点配置
1 | cat > /usr/lib/systemd/system/kube-apiserver.service << EOF |
6.1.3master03节点配置
1 | cat > /usr/lib/systemd/system/kube-apiserver.service << EOF |
参数
1 | 该配置文件是用于定义Kubernetes API Server的systemd服务的配置。systemd是一个用于启动和管理Linux系统服务的守护进程。 |
6.1.4启动apiserver(所有master节点)
1 | systemctl daemon-reload |
6.2.配置kube-controller-manager service
1 | 所有master节点配置,且配置相同 |
参数
1 | 这是一个用于启动 Kubernetes 控制器管理器的 systemd 服务单元文件。下面是对每个部分的详细解释: |
6.2.1启动kube-controller-manager,并查看状态
1 | systemctl daemon-reload |
6.3.配置kube-scheduler service
6.3.1所有master节点配置,且配置相同
1 | cat > /usr/lib/systemd/system/kube-scheduler.service << EOF |
参数
1 | 这是一个用于启动 Kubernetes 调度器的 systemd 服务单元文件。下面是对每个部分的详细解释: |
6.3.2启动并查看服务状态
1 | systemctl daemon-reload |
7.TLS Bootstrapping配置
7.1在master01上配置
1 | 在《5.高可用配置》选择使用那种高可用方案 |
7.2查看集群状态,没问题的话继续后续操作
1 | 1.28 版本只能查看到一个etcd 属于正常现象 |
8.node节点配置
8.1.在master01上将证书复制到node节点
1 | cd /etc/kubernetes/ |
8.2.kubelet配置
注意 : 8.2.1 和 8.2.2 需要和 上方 2.1 和 2.2 对应起来
8.2.1当使用docker作为Runtime
1 | cat > /usr/lib/systemd/system/kubelet.service << EOF |
8.2.2当使用Containerd作为Runtime (推荐)
1 | mkdir -p /var/lib/kubelet /var/log/kubernetes /etc/systemd/system/kubelet.service.d /etc/kubernetes/manifests/ |
8.2.3所有k8s节点创建kubelet的配置文件
1 | cat > /etc/kubernetes/kubelet-conf.yml <<EOF |
8.2.4启动kubelet
1 | systemctl daemon-reload |
8.2.5查看集群
1 | [root@k8s-master01 ~]# kubectl get node |
8.2.6查看容器运行时
1 | [root@k8s-master01 ~]# kubectl describe node | grep Runtime |
8.3.kube-proxy配置
8.3.1将kubeconfig发送至其他节点
1 | master-1执行 |
8.3.2所有k8s节点添加kube-proxy的service文件
1 | cat > /usr/lib/systemd/system/kube-proxy.service << EOF |
8.3.3所有k8s节点添加kube-proxy的配置
1 | cat > /etc/kubernetes/kube-proxy.yaml << EOF |
8.3.4启动kube-proxy
1 | systemctl daemon-reload |
9.安装网络插件
注意 9.1 和 9.2 二选其一即可,建议在此处创建好快照后在进行操作,后续出问题可以回滚
** centos7 要升级libseccomp 不然 无法安装网络插件**
1 | https://github.com/opencontainers/runc/releases |
9.1安装Calico
9.1.1更改calico网段
1 | wget https://mirrors.chenby.cn/https://github.com/projectcalico/calico/blob/master/manifests/calico-typha.yaml |
9.1.2查看容器状态
1 | calico 初始化会很慢 需要耐心等待一下,大约十分钟左右 |
9.2 安装cilium
9.2.1 安装helm
1 | [root@k8s-master01 ~]# curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 |
9.2.2 安装cilium
1 | 添加源 |
9.2.3 查看
1 | [root@k8s-master01 ~]# kubectl get pod -A | grep cil |
9.2.4 下载专属监控面板
安装时候没有创建 监控可以忽略
1 | [root@k8s-master01 yaml]# wget https://mirrors.chenby.cn/https://raw.githubusercontent.com/cilium/cilium/1.12.1/examples/kubernetes/addons/prometheus/monitoring-example.yaml |
9.2.5 下载部署测试用例
说明 测试用例 需要在 安装CoreDNS 之后即可完成
1 | wget https://mirrors.chenby.cn/https://raw.githubusercontent.com/cilium/cilium/master/examples/kubernetes/connectivity-check/connectivity-check.yaml |
9.2.6 查看pod
1 | [root@k8s-master01 yaml]# kubectl get pod -A |
9.2.7 修改为NodePort
安装时候没有创建 监控可以忽略
1 | [root@k8s-master01 yaml]# kubectl edit svc -n kube-system hubble-ui |
9.2.8 查看端口
安装时候没有创建 监控可以忽略
1 | [root@k8s-master01 yaml]# kubectl get svc -A | grep monit |
9.2.9 访问
安装时候没有创建 监控可以忽略
1 | http://192.168.1.31:30707 |
10.安装CoreDNS
10.1以下步骤只在master01操作
10.1.1修改文件
1 | 下载tgz包 |
11.安装Metrics Server
11.1以下步骤只在master01操作
11.1.1安装Metrics-server
在新版的Kubernetes中系统资源的采集均使用Metrics-server,可以通过Metrics采集节点和Pod的内存、磁盘、CPU和网络的使用率
1 | 下载 |
11.1.2稍等片刻查看状态
1 | kubectl top node |
12.集群验证
12.1部署pod资源
1 | cat<<EOF | kubectl apply -f - |
12.2用pod解析默认命名空间中的kubernetes
1 | 查看name |
12.3测试跨命名空间是否可以解析
1 | 查看有那些name |
12.4每个节点都必须要能访问Kubernetes的kubernetes svc 443和kube-dns的service 53
1 | telnet 10.96.0.1 443 |
12.5Pod和Pod之前要能通
1 | kubectl get po -owide |
12.6创建三个副本,可以看到3个副本分布在不同的节点上(用完可以删了)
1 | cat<<EOF | kubectl apply -f - |
13.安装dashboard
1 | helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/ |
13.1更改dashboard的svc为NodePort,如果已是请忽略
1 | kubectl edit svc kubernetes-dashboard -n kube-system |
13.2查看端口号
1 | kubectl get svc kubernetes-dashboard -n kube-system |
13.3创建token
1 | cat > dashboard-user.yaml << EOF |
13.3登录dashboard
14.ingress安装
14.1执行部署
1 | wget https://mirrors.chenby.cn/https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml |
14.2过滤查看ingress端口
1 | 修改为nodeport |
15.IPv6测试
1 | 部署应用 |
16.安装命令行自动补全功能
1 | yum install bash-completion -y |
附录
1 | 镜像加速器可以使用DaoCloud仓库,替换规则如下 |