kubeadm安装高可用k8s v1.22.0
所有用到的组件官网链接
k8s官网文档:https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/
阿里云docker安装:https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.40191b11zjldS6
阿里云k8s安装:https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.40191b11zjldS6
kube-vip官网:https://kube-vip.io/docs/
ingress-nginx官网:https://kubernetes.github.io/ingress-nginx/deploy/
rancher官网:https://rancher.com/docs/
整体架构
节点名 | IP地址 |
---|---|
master-kube-vip | 192.168.0.20 |
master01 | 192.168.0.21 |
matser02 | 192.168.0.22 |
master03 | 192.168.0.23 |
node01 | 192.168.0.24 |
node02 | 192.168.0.25 |
node03 | 192.168.0.26 |
vip-range | 192.168.0.27-30 |
如下图所示
规格参考
以上来自阿里云的参考,根据自己的集群规模选择合适的master规模。
系统基础配置
以下所有操作在所有主机上执行
安装基础软件
更新系统yum源
yum update -y
查看系统时区,同步时间
date -R
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
安装需要用到的工具
yum install wget vim lrzsz net-tools -y
关闭防火墙和swap
关闭防火墙
systemctl stop firewalld.service && systemctl disable firewalld.service
关闭swap
# 注释掉/etc/fstab配置下的swap
sed -i '/swap/ s/^/#/' /etc/fstab
# 临时关闭
swapoff -a
# 永久关闭
sed -i '$a vm.swappiness = 0' /etc/sysctl.conf
sysctl -p
关闭senlinux
sed -i 's/SENLINUX=enforcing/SENLINUX=disabled/' /etc/selinux/config
setenforce=0
getenforce
修改主机名
# 分别修改对应的主机名,所有主机上执行
hostnamectl set-hostname k8s-master01
# 生效操作
bash
# 加入host解析,编辑hosts文件
vim /etc/hosts
# 新增以下配置
192.168.0.20 kube-vip
192.168.0.21 k8s-master01
192.168.0.22 k8s-master02
192.168.0.23 k8s-master03
192.168.0.24 k8s-node01
192.168.0.25 k8s-node02
192.168.0.26 k8s-node03
iptables设置
允许iptables检查桥接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
以上所有操作完成后重启主机
docker安装
docker安装采用阿里云上的文档,具体操作如下,在所有主机上执行
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start
# 注意:
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ce.repo
# 将[docker-ce-test]下方的enabled=0修改为enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
# Loading mirror speeds from cached hostfile
# Loaded plugins: branch, fastestmirror, langpacks
# docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable
# docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable
# docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
# Available Packages
# Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]
docker安装完成后修改docker驱动以及日志配置
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"registry-mirrors": ["https://mjbhllf9.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
# 重新加载配置
systemctl daemon-reload
# 重启docker
systemctl restart docker
kubernetes安装
k8s 也采用阿里源,在所有主机上执行
# 配置阿里源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
##这里由于可能会存在索引gpg检查失败的情况,所以提前将索引检查参数设为0
# 查看所有可安装的k8s版本
yum --disablerepo="*" --enablerepo="kubernetes" list available --showduplicates
# 指定版本安装,本次安装采用1.22.0版本
yum install --enablerepo="kubernetes" kubelet-1.22.0-0.x86_64 kubeadm-1.22.0-0.x86_64 kubectl-1.22.0-0.x86_64
# 查看是否安装成功
kubectl version
kubeadm version
# 添加命令自动补全
yum install bash-completion -y
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
# 永久生效
echo 'source <(kubectl completion bash)' >>~/.bashrc
echo 'source <(kubeadm completion bash)' >>~/.bashrc
# 添加开机启动
systemctl enable kubelet.service
初始化master01节点以及部署kube-vip
在master01上执行,kube-vip使用BGP模式,可以看一下官方文档大概了解一下
# 设置master的vip地址
export VIP=192.168.0.20
# 设置vip地址所在的网卡,这里使用本地环回接口
export INTERFACE=lo
# 设置kube-vip版本
export KVVERSION=v0.3.1
# 提前拉一下镜像
docker pull docker.io/plndr/kube-vip:0.3.1
# 创建静态pod资源
alias kube-vip="docker run --network host --rm ghcr.io/kube-vip/kube-vip:$KVVERSION"
kube-vip manifest pod \
--interface $INTERFACE \
--vip $VIP \
--controlplane \
--services \
--bgp \
--localAS 65000 \
--bgpRouterID 192.168.0.21 \
--bgppeers 192.168.0.22:65000::false,192.168.0.23:65000::false |tee /etc/kubernetes/manifests/kube-vip.yaml
# 使用kubeadm初始化master01节点
kubeadm init \
--kubernetes-version 1.22.0 \
--control-plane-endpoint 192.168.0.20 \
--upload-certs --image-repository registry.aliyuncs.com/google_containers \
--apiserver-advertise-address 192.168.0.21 \
--apiserver-bind-port 6443 \
--pod-network-cidr 10.244.0.0/16
在输出界面上看到以下内容,表示安装成功,失败的话看下报错在具体分析
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
You can now join any number of the control-plane node running the following command on each as root:
kubeadm join 192.168.0.20:6443 --token hrhzqy.hypp28vcoebfc1br \
--discovery-token-ca-cert-hash sha256:60299e96456260e74d8a9fb521e1952094a38b49b431078f447ad18c2eb822df \
--control-plane --certificate-key b353f53b224da2cf95ccb91d9b2a7469786f0e70282e284b7280d8ea126de1fb
Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.0.20:6443 --token hrhzqy.hypp28vcoebfc1br \
--discovery-token-ca-cert-hash sha256:60299e96456260e74d8a9fb521e1952094a38b49b431078f447ad18c2eb822df
# 安装输出提示执行以下命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 查看网络是否生效
kubectl cluster-info dump | grep -m 1 cluster-cidr
添加master02和master03节点
以下操作在master02和master03上执行
# 检查api-server地址是否连通
ping 192.168.0.20
# 安装master01上输出的命令在master02和03上执行加入控制平面的操作
kubeadm join 192.168.0.20:6443 --token hrhzqy.hypp28vcoebfc1br \
--discovery-token-ca-cert-hash sha256:60299e96456260e74d8a9fb521e1952094a38b49b431078f447ad18c2eb822df \
--control-plane --certificate-key b353f53b224da2cf95ccb91d9b2a7469786f0e70282e284b7280d8ea126de1fb
# 分别安装kube-vip
# 在master02上执行
export VIP=192.168.0.20
export INTERFACE=lo
docker pull docker.io/plndr/kube-vip:0.3.1
alias kube-vip="docker run --network host --rm plndr/kube-vip:0.3.1"
kube-vip manifest pod \
--interface $INTERFACE \
--vip $VIP \
--controlplane \
--services \
--bgp \
--localAS 65000 \
--bgpRouterID 192.168.0.22 \
--bgppeers 192.168.0.21:65000::false,192.168.0.23:65000::false |tee /etc/kubernetes/manifests/kube-vip.yaml
# 在master03上执行
export VIP=192.168.0.20
export INTERFACE=lo
docker pull docker.io/plndr/kube-vip:0.3.1
alias kube-vip="docker run --network host --rm plndr/kube-vip:0.3.1"
kube-vip manifest pod \
--interface $INTERFACE \
--vip $VIP \
--controlplane \
--services \
--bgp \
--localAS 65000 \
--bgpRouterID 192.168.0.23 \
--bgppeers 192.168.0.21:65000::false,192.168.0.22:65000::false |tee /etc/kubernetes/manifests/kube-vip.yaml
# 查看pod状态
kubectl get pod -A
# 查看node状态
kubectl get node
# 此时集群处于未就绪状态,因为此时还未安装CNI插件
安装CNI插件
CNI插件常见的有flannel,calico等,calico相对于flannel增加了配置网络策略的功能,本次安装采用flannel-v0.14.0
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.14.0/Documentation/kube-flannel.yml
# 如果网络不通,也可以本地先下载好文件,由于本次安装初始化pod地址为10.244.0.0/16,所以不用修改,如果是其它地址,记得修改对应配置
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
# 插件安装完成后查看节点状态
kubectl get node
# NAME STATUS ROLES AGE VERSION
# k8s-master01 Ready control-plane,master 61m v1.22.0
# k8s-master02 Ready control-plane,master 34m v1.22.0
# k8s-master03 Ready control-plane,master 35m v1.22.0
# 此时各节点已处于ready状态
# 直接apply如果失败的话可能服务器到github的连接有问题,可以先本地把对应的yaml文件下载下来放到服务器上再进行安装
flannel在某个版本的更新中出现个问题,部署后的flannel目录下面少了flannel可执行文件,具体目录为/opt/cni/bin,具体参考https://blog.csdn.net/wdy_2099/article/details/127067372,该问题在最新的版本中已修复,可自行安装最新版本的flannel。
添加work节点
# master初始化成功后会显示node的加入命令,直接在所有node节点上执行
kubeadm join 192.168.0.20:6443 --token hrhzqy.hypp28vcoebfc1br \
> --discovery-token-ca-cert-hash sha256:60299e96456260e74d8a9fb521e1952094a38b49b431078f447ad18c2eb822df
# 出现如下提示表示成功加入
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster
# 此时在master节点查看信息,待flanner插件自动安装完成后
kubectl get node
# NAME STATUS ROLES AGE VERSION
# k8s-master01 Ready control-plane,master 67m v1.22.0
# k8s-master02 Ready control-plane,master 39m v1.22.0
# k8s-master03 Ready control-plane,master 41m v1.22.0
# k8s-node01 Ready <none> 115s v1.22.0
# k8s-node02 Ready <none> 110s v1.22.0
# 此时节点已成功加入集群
安装kube-vip cloud provider做负载均衡器
# 安装控制器,同CNI插件,直接安装失败先下载文件到本地
kubectl apply -f https://raw.githubusercontent.com/kube-vip/kube-vip-cloud-provider/main/manifest/kube-vip-cloud-controller.yaml
# 配置vip,对应文件如下
vim kube-vip-range.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: kubevip
namespace: kube-system
data:
range-global: 192.168.0.28-192.168.0.30 #全局可用地址
cidr-ingress-nginx: 192.168.0.27/32 #分配给ingress-nginx命名空间的地址
# 创建configmap资源
kubectl apply -f kube-vip-range.yaml
# 测试vip是否生效
# 部署nginx获取kube-vip cloud provider的负载均衡器地址
kubectl create deployment nginx --image=nginx:latest --port=80 --replicas 3
# 关联delopy-nginx并使用loadbalancer的方式暴露服务
kubectl expose deploy nginx --port=80 --target-port=80 --name nginx --type=LoadBalancer
# 查看对应的svc
kubectl get svc
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
# kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 94m
# nginx LoadBalancer 10.100.141.88 192.168.0.28 80:31654/TCP 57s
# 可以看到nginx的暴露地址为192.168.0.27,是我们配置的vip-range内的地址
# 执行curl命令到对应的地址
curl 192.168.0.28 31654
#输出如下
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
curl: (7) Failed to connect to 0.0.123.166: Invalid argument
#安装成功
安装ingress-nginx做控制器
ingress可以作为整个集群的入口,ingress目前有很多种,详细的介绍以后会说,本次采用ingress-nginx v1.3.0
# 下载安装文件
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.3.0/deploy/static/provider/baremetal/deploy.yaml
# 修改相应配置,由于k8s.gcr.io相关的镜像国内都进行屏蔽了,所以需要自行去修改为国内可用的镜像地址,并且需要在以下配置新增一行
args:
- /nginx-ingress-controller
- --election-id=ingress-controller-leader
- --controller-class=k8s.io/ingress-nginx
- --configmap=$(POD_NAMESPACE)/ingress-nginx-controller
- --validating-webhook=:8443
- --validating-webhook-certificate=/usr/local/certificates/cert
- --validating-webhook-key=/usr/local/certificates/key
- --watch-ingress-without-class=true # 此处新增配置作用可查看官方文档
# 修改类型为DaemonSet
kind: Deplyment 修改 kind: DaemonSet
# 修改完成后执行
kubectl apply -f deploy.yaml
# 查看pod状态
kubectl get pod -n ingress-nginx
# NAME READY STATUS RESTARTS AGE
# ingress-nginx-admission-create--1-dhfqc 0/1 Completed 0 11m
# ingress-nginx-admission-patch--1-njj4j 0/1 Completed 0 11m
# ingress-nginx-controller-7fl7b 1/1 Running 0 11m
#i ngress-nginx-controller-c5fll 1/1 Running 0 11m
# 查看svc
kubectl get svc -n ingress-nginx
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
# ingress-nginx-controller LoadBalancer 10.106.117.15 192.168.0.27 80:30924/TCP,443:30427/TCP 12m
# ingress-nginx-controller-admission ClusterIP 10.96.245.106 <none> 443/TCP 12m
# 这里需要修改控制器的type,默认是nodeport,修改为loadbalancer,此时EXTERNAL-IP地址为192.168.0.27,到这里ingress-nginx已经安装完成
安装nfs做k8s持久化存储sc
此处涉及到的k8s知识点为k8s的存储卷,也就是volume,也就是CSI插件,k8s存储持久卷主要有PV、StorageClass等,此处不详细介绍,本次安装采用nfs作为k8s的sc
# 可以自行新开一台主机作为NFS服务器,我这里直接使用其中一个node节点来作为nfs服务器,其它节点连接这台
# 以下操作在所有主机上执行
# 使用 yum 安装 NFS 安装包,rpcbind 属于它的依赖,也会安装上
yum install nfs-utils
# 设置服务端开机启动
systemctl enable rpcbind
systemctl enable nfs
# 启动 NFS 服务
systemctl start rpcbind
systemctl start nfs
# 以下操作在NFS服务器上执行
# 配置共享目录并授权
mkdir -p /home/data
chmod 755 /home/data
# 根据这个目录,相应配置导出目录
vim /etc/exports
/home/data/ *(rw,sync,no_root_squash,no_all_squash)
# /home/data: 共享目录位置
# *: 客户端 IP 范围,* 代表所有,即没有限制
# rw: 权限设置,可读可写
# sync: 同步共享目录
# no_root_squash: 可以使用 root 授权
# no_all_squash: 可以使用普通用户授权
# 重启nfs
systemctl restart nfs
# 检查一下本地的共享目录
showmount -e localhost
NFS搭建完成后,就需要来创建StorageClass
# StroageClass部署
# 创建Deployment文件(nfs-client.yaml)
kind: Deployment
apiVersion: apps/v1
metadata:
name: nfs-client-provisioner
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: nfs-client-provisioner
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccountName: nfs-client-provisioner
containers:
- name: nfs-client-provisioner
image: quay.io/external_storage/nfs-client-provisioner:latest
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: fuseim.pri/ifs
- name: NFS_SERVER
value: 192.168.0.25 # nfs服务器地址
- name: NFS_PATH
value: /home/data # 共享目录
volumes:
- name: nfs-client-root
nfs:
server: 192.168.0.25
path: /home/data
# 绑定权限(nfs-client-sa.yaml)
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-client-provisioner
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nfs-client-provisioner-runner
rules:
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["events"]
verbs: ["list", "watch", "create", "update", "patch"]
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: run-nfs-client-provisioner
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
namespace: default
roleRef:
kind: ClusterRole
name: nfs-client-provisioner-runner
apiGroup: rbac.authorization.k8s.io
# 创建StorageClass对象(nfs-client-class.yaml)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: course-nfs-storage
provisioner: fuseim.pri/ifs
# 创建这些CRD
kubectl create -f nfs-client.yaml
kubectl create -f nfs-client-sa.yaml
kubectl create -f nfs-client-class.yaml
# k8s1.21版本开始,使用nfs作为后端存储需要在apiserver配置文件里面新增一行配置,不然创建PVC的时候会报错
# 具体原因为基于对性能和统一apiserver调用方式的初衷,移除了对 SelfLink 的支持,而 nfs-provisioner 需要 SelfLink 该项功能
vim /etc/kubernetes/manifests/kube-apiserver.yaml
- --tls-cert-file=/etc/kubernetes/pki/apiserver.crt
- --tls-private-key-file=/etc/kubernetes/pki/apiserver.key
- --feature-gates=RemoveSelfLink=false #该行为新增配置
#修改完成后重启kubelet
systemctl restart kubelet.service
下面测试一下动态PV有没有生效
# 示例文件如下
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pvc
annotations:
volume.beta.kubernetes.io/storage-class: "course-nfs-storage"
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Mi
# k8s支持设置默认的存储类。如果你的集群里面有多个sc,可以设置默认使用的,具体操作如下
kubectl patch storageclass course-nfs-storage -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
helm安装
# 考虑到服务器和github的网络阻碍,helm安装采用二进制安装,需要提前在本地下载好所需要的版本
# 下载地址:https://github.com/helm/helm/releases
# 下载完成后复制到对应服务器,我这里下载到是3.9版本
# 解压
tar -zxvf helm-v3.9.0-linux-amd64.tar.gz
# 解压目中找到helm程序,移动到需要的目录中
mv linux-amd64/helm /usr/local/bin/helm
# 查看版本
helm version
# 输出以下信息表示安装成功
# version.BuildInfo{Version:"v3.9.0", GitCommit:"7ceeda6c585217a19a1131663d8cd1f7d641b2a7", GitTreeState:"clean", GoVersion:"go1.17.5"}
Rancher安装
rancher的具体介绍可自行查看官网文档,简单理解rancher就是一个k8s的可视化管理工具
# rancher安装采用helm安装,需提前安装好helm
# 添加helm库,这里选择稳定版
# 最新版本
helm repo add rancher-latest https://releases.rancher.com/server-charts/latest
# 稳定版本
helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
# alpha:实验性预览
helm repo add rancher-alpha https://releases.rancher.com/server-charts/alpha
# 创建命名空间
kubectl create namespace cattle-system
# 添加证书
kubectl -n cattle-system create secret tls tls-rancher-ingress --cert=cert.pem --key=key.pem
# 部署,这里安装2.6.7
helm install rancher rancher-stable/rancher \
--namespace cattle-system \
--set hostname=rancher.test.com \
--set replicas=3 \
--set ingress.tls.source=secret \
--version=2.6.7
# 安装完成后打开页面按照提示获取默认密码,如果之前集群导入过外部rancher,可能会存在没有默认密码的情况,此时通过以下命令重置密码
kubectl -n cattle-system exec $(kubectl -n cattle-system get pods -l app=rancher | grep '1/1' | head -1 | awk '{ print $1 }') -- reset-password
# 安装过程中出现镜像拉取失败问题,尝试多拉几次,也可以提前下载好镜像传到服务器上
安装完成后访问你配置的域名即可
Harbor安装
harbor是镜像存储仓库,一般不推荐直接在k8s中安装harbor,但是为了方便,本次直接使用helm安装harbor
# 添加helm仓库
helm repo add harbor https://helm.goharbor.io
# 搜索所有可安装的版本
helm search repo -l harbor/harbor
# 选择版本下载安装,这里选择v1.9.0
helm fetch harbor/harbor --version v1.9.0 --untar
# 拉取完会在执行命令的当前目录下生成一个harbor目录,Harbor Chart包相关文件均在此目录中
# 修改value.yaml文件,由于集群中启用了ingress,所以服务暴露统一通过域名
# 修改 ingress域名,改为自己的域名:
hosts:
# The host of Harbor core service in ingress rule
# Harbor core service 的 ingress 规则中的域名
core: harbor.test.com
# The host of Harbor Notary service in ingress rule
# Harbor Notary service ingress 规则中的域名
notary: harbor.test.com
# 默认情况下会启用持久化存储,K8S群集中需要一个默认的 StorageClass 来动态调配卷
kubectl patch storageclass course-nfs-storage -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
# 这里是为了方便直接设置了默认的SC,也可以在配置文件里找到对应的SC设置手动修改为自己集群的SC名称
# 修改externalURL,和ingress配置的域名一样
externalURL: https://harbor.test.com
# 修改默认密码,这里如果不修改的话密码为Harbor12345
harborAdminPassword: "PASSWORD"
# 所有配置修改完成后开始安装
kubectl create ns harbor
helm install harbor -f values.yaml . --namespace harbor
# 等待安装完成后解析加好访问域名,一般情况下是可以正常跳出harbor的登陆页面的,但是我这里第一次安装完成后首次登陆会跳出401未认证的问题,暂时的处理方法是卸掉重装,第二次就好了
# 卸载
helm uninstall harbor -n harbor
新增节点
集群使用中如果资源不足需要新增节点,具体操作如下
# 如何添加node节点
# 在集群添加完成后,当资源不够使用的时候需要添加新node节点
# 重新生成新的token
*默认的toekn的有效期为24小时,当过期之后,该token就不能使用了*
#执行命令获取到结果
kubeadm token create --print-join-command
kubeadm join 192.168.51.93:6443 --token mdmcwh.ypbmw6eje1gdk5ku --discovery-token-ca-cert-hash sha256:45fd3a9af00a45b9ef070570227faf343f7c9860c25a68bddeb32208c358cdbc
# 将结果复制到初始化已经完成的worker节点右键回车,集群将会自动开始添加
# 添加master节点
# 获取certificate-key,在现有master下执行
kubeadm init phase upload-certs --upload-certs
I0706 07:31:58.900389 28850 version.go:251] remote version is much newer: v1.21.2; falling back to: stable-1.20
[upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace
[upload-certs] Using certificate key:
82f6822cc68720ab9cdb94118d4be2a30ec501ee7597c2921b0f286e22a64480
# 获取到key之后拼凑步骤1的内容
> kubeadm join 192.168.51.93:6443 --token mdmcwh.ypbmw6eje1gdk5ku --discovery-token-ca-cert-hash sha256:45fd3a9af00a45b9ef070570227faf343f7c9860c25a68bddeb32208c358cdbc --control-plane --certificate-key e2a129a0e5a267bee140968f974de1f70786da6f3dd7f55b5af68b4a173910c6
*注:这里一个key ,一个token; 以及需要参数 --control-plane*
到此一个功能完备的生产可用k8s集群就安装完成。