安装前需知

  1. 撰写本文的目的主要是为了自己保存一份安装方法的记录,只要有网络就可以查找到安装方案,所以本文并不是安装教程。
  2. 为和我一样的初学都提供一些帮助,但需要大家自己学习本文提到软件的基础知识。
  3. kubernetes安装方式还是很多的,我这里主要用的是kubeadm安装,其它还有二进制安装、kubekey、rancher等等好多种,如果有可能我把简单的方法在后面写点,二进制就算了,麻烦,不过二进制的说是稳定,以后也可以试试。
  4. 文中提到的配置与安装方法主要是为学习k8s的安装和周边基础应用的使用方法,生产环境需另行考虑相关配置与安装方法。毕竟kubernetes是给超大规模集群用,我这就几台虚拟机,不能比的。

一、环境说明

1.1. 主机配置

移动云虚拟机6台:2vCPUs | 4 GiB | 40G | s3.large.2|CentOS 7.9 64bit

我测试的最简配置:
虚拟机1台 :1vCPUs | 4 GiB | 40G | s3.large.2|CentOS 7.9 64bit
就一个master节点
在这里插入图片描述

所有的pod,除了一个coredns其它都正常,还安装了kuboard
在这里插入图片描述
下面是内存和cpu占用,如果去掉污点跑个简单的应用应该能撑得住。
在这里插入图片描述
集群管理平台kuboard可正常使用,可以到master节点里去把污点册了,就可调度所有pod了。
在这里插入图片描述

1.2. 主机名规划

角色主机名IP地址用户名密码
masterkube-m1-01172.16.0.51root@@123456abc
masterkube-m1-02172.16.0.52root@@123456abc
masterkube-m1-03172.16.0.53root@@123456abc
workerkube-n2-0001172.16.0.61root@@123456abc
workerkube-n2-0002172.16.0.62root@@123456abc
workerkube-n2-0003172.16.0.63root@@123456abc

主机名称意义以 kube-m1-01 为例:
kube: 项目名称
m: master管理主机,n代表worker节点主机
1:指代管理主机的一种配置,这里用的是2C/4G/40G的配置,最多9种配置
01:指管理主机的序号,这里最多就到99台。

1.3. 软件版本

用途软件名称版本信息备注
操作系统Centos7.9.2009
k8s安装器kubeadm1.23.5
k8s节点控制器kubelet1.23.5
k8s命令行工具kubectl1.23.5
k8s网络插件calico3.23.1
容器运行管理工具docker19.03.9-3
k8s通用面板dashboard2.5.1选装
七层代理ingress-nginx1.2.0选装
多集群管理平台kuboard最新选装
共享文件系统nfs4.0以上选装
分布式存储(rook部署)ceph16.2.7选装

二、准备工作

只在一台主机上使用root账户配置,其它主机用for命令同步

2.1. SSH配置

关闭ssh首次连接输入yes
root用户

sed -i 's/#   StrictHostKeyChecking ask/StrictHostKeyChecking no/' /etc/ssh/ssh_config

普通用户(都是用的root,写这留做留个记录)

# mkdir $HOME/.ssh
# echo 'StrictHostKeyChecking no' > $HOME/.ssh/config
# chown $(id -u):$(id -g) $HOME/.ssh/config

ssh连接超时终断

sed -i 's/#ClientAliveInterval 0/ClientAliveInterval 60/' /etc/ssh/sshd_config
sed -i 's/#ClientAliveCountMax 3/ClientAliveCountMax 3/' /etc/ssh/sshd_config

重启ssh服务

systemctl restart sshd

安装密码输入交互命令sshpass

yum install -y  sshpass

2.2. 安装工具软件

#我装的软件
yum install -y git ipvsadm ipset lvm2 socat conntrack bind-utils tree

2.3. 为远程执行命令做准备

用ping测试远程命令可达

a="hostname && echo ============ && ping -c 1 www.sina.com.cn && echo """
for i in {5..6}{1..3};do sshpass -p@@123456abc ssh root@172.16.0.$i $a "" ;done

如何为连接方便点就拷贝公钥吧。我一般为安全考虑不这样配,不过就一台主机也无所谓了。

ssh-keygen -t rsa -N '' -f /root/.ssh/id_rsa -q
for i in {5..6}{1..3};do sshpass -p @@123456abc ssh-copy-id 172.16.0.$i;done

三、安装主机基础环境

3.1. 配置主机名

修改主机名,因移动云批量创建的主机,我这只用改172.16.0.51-53的主机名
变更主机名

for i in {1..3};do sshpass -p @@123456abc ssh root@172.16.0.5$i  hostnamectl set-hostname kube-m1-0$i;done

修改51-53主机名127配置

cat << EOF > /tmp/H
#!/bin/bash
sed -ie "s/127.*kube.*$/127.0.0.1\t\`hostname\`/g" /etc/hosts
EOF
for i in {1..3};do sshpass -p @@123456abc scp /tmp/H root@172.16.0.5$i:/tmp/;done
for i in {1..3};do sshpass -p @@123456abc ssh root@172.16.0.5$i sh /tmp/H ;done

修改/etc/hosts文件

#创建hosts临时文件内容,lb.kube.local是移动云做了个LB负载均衡的地址
cat << EOF > /tmp/hosts && hostname && cat /tmp/hosts
172.16.0.51    kube-m1-01
172.16.0.52    kube-m1-02
172.16.0.53    kube-m1-03
172.16.0.61    kube-n2-0001
172.16.0.62    kube-n2-0002
172.16.0.63    kube-n2-0003
X.X.X.X      lb.kube.local
EOF

#拷贝hosts临时文件到各主机
for i in {5..6}{1..3};do sshpass -p @@123456abc scp /tmp/hosts root@172.16.0.$i:/tmp/hosts;done

#核对文件内容
for i in {5..6}{1..3};do sshpass -p @@123456abc ssh root@172.16.0.$i 'hostname && echo ========= && cat /tmp/hosts && echo ""';done
 
 #各主机添加IP到hosts文件
for i in {5..6}{1..3};do sshpass -p @@123456abc ssh root@172.16.0.$i 'hostname && echo ========= && cat /tmp/hosts >> /etc/hosts && cat /etc/hosts && echo ""';done


3.2. yum原

如果要更新内核心需要更新源

#更新主机yum原
for i in {5..6}{1..3};do sshpass -p @@123456abc ssh root@172.16.0.$i yum update -y ;done

#导入ELRepo仓库的公共密钥
a="rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org"
for i in {5..6}{1..3};do sshpass -p @@123456abc ssh root@172.16.0.$i $a ;done

#安装ELRepo仓库的yum源
a="rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm"
for i in {5..6}{1..3};do sshpass -p @@123456abc ssh root@172.16.0.$i $a ;done

3.3. 更新系统内核

此步骤也可不做,除非有些功能模块需要内核支持。

#查看可用的系统内核包
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available

#安装最新版本内核
a="yum --enablerepo=elrepo-kernel install -y kernel-ml"
for i in {5..6}{1..3};do sshpass -p @@123456abc ssh root@172.16.0.$i $a ;done

#查看系统上的所有可用内核
sudo awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg

#设置默认版本,其中 0 是上面查询出来的可用内核
a="grub2-set-default 0"
for i in {5..6}{1..3};do sshpass -p @@123456abc ssh root@172.16.0.$i $a ;done

#生成 grub 配置文件
a="grub2-mkconfig -o /boot/grub2/grub.cfg"
for i in {5..6}{1..3};do sshpass -p @@123456abc ssh root@172.16.0.$i $a ;done

#重启
for i in {6..5}{3..1};do sshpass -p @@123456abc ssh root@172.16.0.$i reboot ;done

#重启后检查下内存是否已更新升级
for i in {5..6}{1..3};do sshpass -p @@123456abc ssh root@172.16.0.$i hostname && echo ======== && uname -r && echo "" ;done

3.4. 系统服务相关

移动云创建的服务器这些都配置好的。

#关闭防火墙
systemctl stop firewalld && systemctl disable firewalld

#关闭 swap
swapoff -a && sed -i '/ swap / s/^(.*)$/#1/g' /etc/fstab

#关闭 selinux
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

#时间同步(centos7.2以后都是chronyd做时间同步,移动云自动配置好了,如果你不是用ntp吧)
yum -y install ntpdate
ntpdate time.windows.com
hwclock --systohc

#设置时区
a="timedatectl set-timezone Asia/Shanghai"
for i in {5..6}{1..3};do sshpass -p @@123456abc ssh root@172.16.0.$i $a ;done

3.5. 网络模块

#将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
for i in {5..6}{1..3};do sshpass -p @@123456abc scp /etc/sysctl.d/k8s.conf root@172.16.0.$i:/etc/sysctl.d/k8s.conf;done
for i in {5..6}{1..3};do sshpass -p @@123456abc ssh root@172.16.0.$i sysctl --system ;done

#安装IPVS模块
tee /etc/modules-load.d/ipvs.conf <<'EOF'
ip_vs
ip_vs_lc
ip_vs_wlc
ip_vs_rr
ip_vs_wrr
ip_vs_lblc
ip_vs_lblcr
ip_vs_dh
ip_vs_sh
ip_vs_fo
ip_vs_nq
ip_vs_sed
ip_vs_ftp
nf_conntrack
ip_tables
ip_set
ipt_rpfilter
ipt_REJECT
ipip
EOF
for i in {5..6}{1..3};do sshpass -p @@123456abc scp /etc/modules-load.d/ipvs.conf root@172.16.0.$i:/etc/modules-load.d/ipvs.conf;done
#内核没更新的下面这步会报错
for i in {5..6}{1..3};do sshpass -p @@123456abc ssh root@172.16.0.$i systemctl enable --now systemd-modules-load.service ;done
for i in {5..6}{1..3};do sshpass -p @@123456abc ssh root@172.16.0.$i hostname && echo =================== && lsmod |grep -e ip_vs -e nf_conntrack && echo "" ;done

3.6. 安装docker-ce

导入镜像源

a="wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo"
for i in {5..6}{1..3};do sshpass -p @@123456abc ssh root@172.16.0.$i $a ;done

查找可用docker版本

yum list docker-ce --showduplicates | sort -r

安装docker,因kubeadm1.23.5只测试到19版,就不住上装了。
单线程顺序执行,比较花时间,可多开窗口同步执行。

a="yum -y install docker-ce-19.03.9-3.el7"
for i in {5..6}{1..3};do sshpass -p @@123456abc ssh root@172.16.0.$i $a ;done

设置镜像加速,换成docker国内和阿里的仓库

mkdir -p /etc/docker/
cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://registry.docker-cn.com",
  "https://l2n3ew60.mirror.aliyuncs.com",
  "https://registry.docker-cn.com",
  "https://docker.mirrors.ustc.edu.cn",
  "http://hub-mirror.c.163.com",
  "https://cr.console.aliyun.com/"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF
for i in {5..6}{1..3};do sshpass -p @@123456abc ssh root@172.16.0.$i mkdir -p /etc/docker/ ;done
for i in {5..6}{1..3};do sshpass -p @@123456abc scp /etc/docker/daemon.json root@172.16.0.$i:/etc/docker/daemon.json ;done

配置docker自启动

a="systemctl enable docker && systemctl start docker && systemctl status docker"
for i in {5..6}{1..3};do sshpass -p @@123456abc ssh root@172.16.0.$i $a;done
for i in {5..6}{1..3};do sshpass -p @@123456abc ssh root@172.16.0.$i hostname && echo ============ && docker version && echo "" ;done

四、kubeadm手工安装kubernetes

4.1. 配置k8s源

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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
for i in {5..6}{1..3};do sshpass -p @@123456abc scp /etc/yum.repos.d/kubernetes.repo root@172.16.0.$i:/etc/yum.repos.d/kubernetes.repo ;done

4.2. 下载k8s安装程序kubeadm和k8s组件与命令工具

#下载
a="yum install -y kubelet-1.23.5 kubeadm-1.23.5 kubectl-1.23.5"
for i in {5..6}{1..3};do sshpass -p @@123456abc ssh root@172.16.0.$i $a ;done

4.3. 安装K8S

4.3.1 安装第一个master节点

注意高可用安装一定要配置好control-plane-endpoint,不做负载均衡可以用127.0.0.1试试,要不就是假的高可用了。

kubeadm init \
--control-plane-endpoint=lb.kube.local \
--upload-certs \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.5 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=Swap,NumCPU \
--apiserver-advertise-address=172.16.0.51 \
--token-ttl 0

安装完成会显示添加master和worker节点的命令,如是你没保留住,后面有添加节点方法介绍。

在master节点上执行操作

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
#或者执行下面操作
export KUBECONFIG=/etc/kubernetes/admin.conf

安装calico网络插件(使用官网50节点以下manifest安装方式)
网络插件网站https://kubernetes.io/docs/concepts/cluster-administration/addons/

curl https://projectcalico.docs.tigera.io/manifests/calico.yaml -O
kubectl apply -f calico.yaml

修改proxy 模型为ipvs,执行以下命令后,修改mode为“ipvs"

kubectl edit configmap kube-proxy -n kube-system

在这里插入图片描述

删除之前已生成kube-proxy的pods,集群会自动创建新kube-proxy的pod

for i in `kubectl get pods -n kube-system | grep kube-proxy | awk '{print $1}'`; do kubectl delete pod $i -n kube-system ;done

查看POD日志 kubectl logs kube-proxy-b9vms -n kube-system,确认是不是IPVS模式
在这里插入图片描述
修改proxy 模型为ipvs,执行以下命令后,修改mode为“ipvs"

kubectl edit configmap kube-proxy -n kube-system

在这里插入图片描述

删除之前已生成kube-proxy的pods,集群会自动创建新kube-proxy的pod

for i in `kubectl get pods -n kube-system | grep kube-proxy | awk '{print $1}'`; do kubectl delete pod $i -n kube-system ;done

查看POD日志 kubectl logs -n kube-system,确认是不是IPVS模式
在这里插入图片描述

查看集群信息

kubectl cluster-info

查看集群节点状态

kubectl get node

查看集群pod状态

kubectl get pod -A

查看集群部件状态1.19版后已弃用

kubectl get cs

查看etcd成员,我的etcd安装在k8s内部,所以需要在容器内运行(此步骤在全部etcd节点安装好后再检查)

#查询成员列表
etcdctl  --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key member list
#查询etcd集群状态
etcdctl  --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key endpoint status --cluster -w table

4.3.2 添加master节点

#打印添加节点所用的token,
kubeadm token create --print-join-command
#输出结果kubeadm join kube-m1-01:6443 --token 8hcidv.z4hrmqkl70d0bvmt --discovery-token-ca-cert-hash sha256:9df2b0ef7e125420f6ffe53e4cbd701798aa6f2a98b5ff2733f97540b3978e47
#不改配置这个token能用24小时,其实kubeadm安装时加--token-ttl 0生成了一个永久的token,可用kubeadm token list 找到它,再与CA的hash组合做成一个永久的命令。

#生成装载证书所需的key
kubeadm init phase upload-certs --upload-certs
#比如这里生成的key是:6379ba266f4dcac58d703193f13ac483e96350c785044002aa025057fba51479

#把上面两条命令的结果合并如下,注意这里有token,ca的hash sha256和key,别少了。
kubeadm join kube-m1-01:6443 --token wqx54o.ybk3nwdrmvwb3e1y \
        --discovery-token-ca-cert-hash sha256:9df2b0ef7e125420f6ffe53e4cbd701798aa6f2a98b5ff2733f97540b3978e47 \
        --control-plane \
        --certificate-key dc37ad9c215c029a3130bb1b8524ceba783d1c7efe4d652e780acee6f02c959b \
        --ignore-preflight-errors=all
#因为我测试就用一个CPU就加上这个--ignore-preflight-errors=all,忽略所有错误

#完成后加配置文件
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf

新加节点后重新分布DNS服务

kubectl -n kube-system rollout restart deployment coredns

4.3.3 添加worker节点

#在master节点上执行下面命令
kubeadm token create --print-join-command

#在workd节点上输入得到的命令
kubeadm join kube-m1-01:6443 --token i56sf8.m6pei12qxu7amyh6 --discovery-token-ca-cert-hash sha256:d78f0288a44403ae38e9f84cd16338b62aaa6ebe89bae36d29bf4c8226b1eb4d

#为worker节点添加标签
kubectl label node <节点名> node-role.kubernetes.io/worker=

所有节点kubelet自启动

for i in {5..6}{1..3};do sshpass -p @@123456abc ssh root@172.16.0.$i systemctl enable kubelet ;done

4.3.4 其它配置

命令补全

# Install bash-completion
yum install -y bash-completion
# Source the completion script in your ~/.bashrc file
echo 'source <(kubectl completion bash)' >>~/.bashrc
# Add the completion script to the /etc/bash_completion.d directory
kubectl completion bash >/etc/bash_completion.d/kubectl

使worker节点能使用kubectl以管理员权限管理集群
这里只配置172.16.0.61

#主机上拷贝配置文件
sshpass -p@@123456abc scp /etc/kubernetes/admin.conf root@172.16.0.61:/etc/kubernetes/

#登录172.16.0.61配置执行kubectl所需参数
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile && source ~/.bash_profile

#使用kubectl命令测试
kubectl get node

最后再查看下集群各状态是否都正常,有的POD可能要等好一会儿做同步。
如果没问题那k8s就装好了。
可以验证下集群,在这里master主机不能少于两台,要不高可用就坏了。

五、配置存储

5.1. nfs存储

拿一台master节点做的服务器,有单点风险。

在每个机器安装nfs工具

a="yum install -y nfs-utils"
for i in {5..6}{1..3};do sshpass -p @@123456abc ssh root@172.16.0.$i $a ;done

在master 执行以下命令

echo "/mnt/nfs/ *(insecure,rw,sync,no_root_squash)" > /etc/exports
mkdir -p /mnt/nfs
systemctl enable rpcbind
systemctl enable nfs-server
systemctl start rpcbind
systemctl start nfs-server
exportfs -r
exportfs

其它主机挂载NFS目录

a="mkdir -p /mnt/nfs && mount.nfs 172.16.0.51:/mnt/nfs /mnt/nfs"
for i in {5..6}{1..3};do sshpass -p @@123456abc ssh root@172.16.0.$i $a ;done

#查询服务器配置有共享目录
showmount -e 172.16.0.51

storageclass就到kuboard里创建吧,想个名字点点点就行了。

5.2. ceph存储

ceph主页:https://ceph.io/
我们以生产环境的最底要求安装,在三个worker节点上各增加一个没有格式化过的空盘,如果磁盘使用过用下面的命令清空。

#清理硬盘数据(hdd硬盘使用dd,ssd硬盘使用blkdiscard)
dd if=/dev/zero of=/dev/vdb bs=1M count=100 oflag=direct,dsync
blkdiscard /dev/vdb

用lsblk -f 查看磁盘文件系统信息,保证是个空盘。
在这里插入图片描述

5.2.1. 安装ceph

wget https://github.com/rook/rook/archive/refs/tags/v1.8.0.zip
unzip v1.8.0.zip
cd rook-1.8.0/deploy/examples/
======================================================================
#修改镜像下载地址
vim operator.yaml
  # ROOK_CSI_CEPH_IMAGE: "quay.io/cephcsi/cephcsi:v3.4.0"
  # ROOK_CSI_REGISTRAR_IMAGE: "k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.3.0"
  # ROOK_CSI_RESIZER_IMAGE: "k8s.gcr.io/sig-storage/csi-resizer:v1.3.0"
  # ROOK_CSI_PROVISIONER_IMAGE: "k8s.gcr.io/sig-storage/csi-provisioner:v3.0.0"
  # ROOK_CSI_SNAPSHOTTER_IMAGE: "k8s.gcr.io/sig-storage/csi-snapshotter:v4.2.0"
  # ROOK_CSI_ATTACHER_IMAGE: "k8s.gcr.io/sig-storage/csi-attacher:v3.3.0"

  ROOK_CSI_REGISTRAR_IMAGE: "registry.cn-hangzhou.aliyuncs.com/google_containers/csi-node-driver-registrar:v2.3.0"
  ROOK_CSI_RESIZER_IMAGE: "registry.cn-hangzhou.aliyuncs.com/google_containers/csi-resizer:v1.3.0"
  ROOK_CSI_PROVISIONER_IMAGE: "registry.cn-hangzhou.aliyuncs.com/google_containers/csi-provisioner:v3.0.0"
  ROOK_CSI_SNAPSHOTTER_IMAGE: "registry.cn-hangzhou.aliyuncs.com/google_containers/csi-snapshotter:v4.2.0"
  ROOK_CSI_ATTACHER_IMAGE: "registry.cn-hangzhou.aliyuncs.com/google_containers/csi-attacher:v3.3.0"

#修改worker节点驱动支持
  # CSI_PLUGIN_TOLERATIONS: |
  #   - effect: NoSchedule
  #     key: node-role.kubernetes.io/controlplane
  #     operator: Exists
  #   - effect: NoExecute
  #     key: node-role.kubernetes.io/etcd
  #     operator: Exists
  
  CSI_PLUGIN_TOLERATIONS: |
    - effect: NoSchedule
      key: node-role.kubernetes.io/master
      operator: Exists
      
=======================================================================
kubectl apply -f crds.yaml -f common.yaml -f operator.yaml
kubectl apply -f cluster.yaml
#等待pod完全创建成功,时间比较长
watch -n 2 kubectl get pod -nrook-ceph

安装命令行管理工具pod

kubectl apply -f toolbox.yaml
#登录pod
kubectl -nrook-ceph get pod |grep tools
kubectl -n rook-ceph exec -it  <pod名> /bin/bash
查看集群状态
[rook@<pod名> /]$ exec -s

安装图形看板

kubectl apply -f dashboard-external-https.yaml
#获取dashboard登录密码(登录用户admin)
kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o \
jsonpath="{['data']['password']}" | base64 -d

在这里插入图片描述

5.2.2. 部署rbd和cephfs

#用官方提供的脚本创建1个rbd pool
kubectl apply -f csi/rbd/storageclass.yaml
#用官方提供的脚本创建cephfs
kubectl apply -f filesystem.yaml

5.2.3 创建存储类

#用官方提供的脚本创建一个存储类
kubectl apply -f csi/cephfs/storageclass.yaml

5.3. 设置默认存储类

#查看所有的存储类
kubectl get sc
#用其中一个存储类设置为默认存储类
kubectl patch storageclass <类名> -p '{"metadata": {"annotations":{"storageclass.beta.kubernetes.io/is-default-class":"true"}}}'
#查看默认存储类是否加上
kubectl get sc

六、安装集群管理工具

6.1.通用控制面板dashboard

一个单集群管理工具,功能相对有点简单,我基本已经不用它了。

6.1.1 下载安装文件

登录:https://github.com/kubernetes/dashboard/releases

查看版本兼容性,我们这找到v2.5.1合适,就选它了
在这里插入图片描述

#下载
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml

6.1.2. 变更集群访问权限

编辑yaml文件,原集群角色绑定权限不能访问整个集群,我们改绑到集群角色cluster-admin上。

vim recommended.yaml

修改前绑定角色
在这里插入图片描述
修改后绑定角色
在这里插入图片描述

6.1.3. 安装并配置公网访问

安装dashboard:

kubectl apply -f recommended.yaml

配置网络:
在kuboard上,找到kubernetes-dashboard名称空间,修改SVC服务kubernetes-dashboard的类型为NodePort,指定个端口,我这指定的是30000端口。

在这里插入图片描述
使用NodePort,端口30000
在这里插入图片描述

公网访问:
移动云上配置一个LB做四层转发,注意安全组入方向规则要开通100.125.0.0/16地址段,因为移动云是靠这个段转发数据的。

6.1.4. 使用token登录dashboard

登录kuboard复制token密文

在kuboard上的找到dashboard的token密文在这里插入图片描述
复制的token密文
在这里插入图片描述

用复制的token密文登录dashboard>在这里插入图片描述

6.2. 使用kuboard管理集群

6.2.1. 安装kuboard

kuboard是一个多集群管理工具,我们直接安装到k8s集群里,个人感觉非常好用,适合新手,可惜免费版的只能接入三个集群。
kuboard官网:https://kuboard.cn
安装 kuboard:

#使用华为云的镜像安装
kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3-swr.yaml

nodeport端口是30080
用户名:admin
密码:Kuboard123

6.2.2. 安装资源层监控套件

5.2.1. 创建存储类StorageClass

我这里配置nfs共享存储,拿一台master节点做的服务器,有单点风险。

# 在每个机器。
a="yum install -y nfs-utils"
for i in {5..6}{1..3};do sshpass -p @@123456abc ssh root@172.16.0.$i $a ;done

# 在master 执行以下命令 
echo "/mnt/nfs/ *(insecure,rw,sync,no_root_squash)" > /etc/exports
mkdir -p /mnt/nfs
systemctl enable rpcbind
systemctl enable nfs-server
systemctl start rpcbind
systemctl start nfs-server
exportfs -r
exportfs

#其它主机挂载NFS目录
a="mkdir -p /mnt/nfs && mount.nfs 172.16.0.51:/mnt/nfs /mnt/nfs"
for i in {5..6}{1..3};do sshpass -p @@123456abc ssh root@172.16.0.$i $a ;done

#查询服务器配置有共享目录
showmount -e 172.16.0.51

登录kuboard创建存储类,并设置成默认类。
在这里插入图片描述
在这里插入图片描述

手动设置默认类方法

#查看有哪些存储类
kubectl get sc

#比如查到的类有个叫nfs的,用下面命令把它设置成默认类。
kubectl patch storageclass nfs -p '{"metadata": {"annotations":{"storageclass.beta.kubernetes.io/is-default-class":"true"}}}'

5.2.2. 安装资源层监控套件

如下图所示位置找到套件安装,具体安装步骤跟跟网页提示一步步来。
在这里插入图片描述

5.3. 安装日志聚合套件 Loki

Loki和EFK都可安装,我这里选的是Loki,两套日志收集软件各有优缺点,网页上有介绍,自择。
在这里插入图片描述

5.4. 安装存储卷浏览器

在这里插入图片描述

七、ingress安装与配置

7.1. 安装ingress

登录github查看兼容性列表:https://github.com/kubernetes/ingress-nginx

这几个都适用
在这里插入图片描述

找到链接或直接访问: https://kubernetes.github.io/ingress-nginx/deploy/

在这里插入图片描述

点击Quick start在这里插入图片描述
我们不用helm,用yaml安装,翻看一下,是1.2.0版本,适合我们用
在这里插入图片描述

有时网络限制,镜像文件下载不了,先把文件下载到本地改用阿里镜像再安装

#下载
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.2.0/deploy/static/provider/cloud/deploy.yaml

#查找替换从阿里找到的镜像文件
sed -i 's/image: k8s.gcr.io\/ingress-nginx\/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660/image: registry.cn-hangzhou.aliyuncs.com\/google_containers\/kube-webhook-certgen:v1.1.1/' deploy.yaml
sed -i 's/image: k8s.gcr.io\/ingress-nginx\/controller:v1.2.0@sha256:d8196e3bc1e72547c5dec66d6556c0ff92a23f6d0919b206be170bc90d5f9185/image: registry.cn-hangzhou.aliyuncs.com\/google_containers\/nginx-ingress-controller:v1.2.0/' deploy.yaml
#修改外部流量策略,由Local改成Cluster
sed -i 's/externalTrafficPolicy: Local/externalTrafficPolicy: Cluster/' deploy.yaml

#安装
kubectl apply -f deploy.yaml

7.2. ingress暴露NodePort端口

在kuboard里查看ingress-nginx名称空间里服务ingress-nginx-controller暴露的NodePort端口

我这里修改过配置文件,所以能暴露80端口
在这里插入图片描述
把所有master主机的配置文件/etc/kubernetes/manifests/kube-apiserver.yaml,加一条参数- --service-node-port-range=80-32767

在这里插入图片描述

7.3. 配置应用路由,实现七层代理

这里就用kuboard做了代理配置,可以直接公网访问。公网的IP,域名,备案等因原来有就直接使用了,如果没有域名那还是用NodePort端口的四层代理吧。
这是配置好了的,在这里插入图片描述>主要的配置项
在这里插入图片描述

八、其它安装k8s方法

8.1. kybekey

登录kubesphere主页:https://kubesphere.com.cn/ ,导航栏“文档中心”里点最新的,找到搜索,输入kubekey

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

安装方法自己看了,网页上都有。
注意事项:

  1. 国内访问 GitHub/Googleapis 受限,要用受限的安装方法
  2. docker最好提前装好,或配置国内镜像,让kubekey自己装docker
  3. conntrack没装的必需手动yum装下。
  4. 配置文件config-sample.yaml我写成这样的,用的内部负载均衡 internalLoadbalancer: haproxy
apiVersion: kubekey.kubesphere.io/v1alpha2
kind: Cluster
metadata:
  name: sample
spec:
  hosts:
  - {name: kube-m1-01, address: 172.16.0.51, internalAddress: 172.16.0.51, user: root, password: "@@123456abc"}
  - {name: kube-m1-02, address: 172.16.0.52, internalAddress: 172.16.0.52, user: root, password: "@@123456abc"}
  - {name: kube-m1-03, address: 172.16.0.53, internalAddress: 172.16.0.53, user: root, password: "@@123456abc"}
  - {name: kube-n2-0001, address: 172.16.0.61, internalAddress: 172.16.0.61, user: root, password: "@@123456abc"}
  - {name: kube-n2-0002, address: 172.16.0.62, internalAddress: 172.16.0.62, user: root, password: "@@123456abc"}
  - {name: kube-n2-0003, address: 172.16.0.63, internalAddress: 172.16.0.63, user: root, password: "@@123456abc"}
  roleGroups:
    etcd:
    - kube-m1-01
    - kube-m1-02
    - kube-m1-03
    control-plane:
    - kube-m1-01
    - kube-m1-02
    - kube-m1-03
    worker:
    - kube-n2-0001
    - kube-n2-0002
    - kube-n2-0003
  controlPlaneEndpoint:
    ## Internal loadbalancer for apiservers
    internalLoadbalancer: haproxy

    domain: lb.local
    address: ""
    port: 6443
  kubernetes:
    version: v1.21.5
    clusterName: cluster.local
  network:
    plugin: calico
    kubePodsCIDR: 10.233.64.0/18
    kubeServiceCIDR: 10.233.0.0/18
    ## multus support. https://github.com/k8snetworkplumbingwg/multus-cni
    multusCNI:
      enabled: false
  registry:
    plainHTTP: false
    privateRegistry: ""
    namespaceOverride: ""
    registryMirrors: []
    insecureRegistries: []
  addons: []

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐