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规格

以上来自阿里云的参考,根据自己的集群规模选择合适的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集群就安装完成。

posted @ 2023-05-02 20:18  pollosD  阅读(11)  评论(0编辑  收藏  举报