CentOS7.9 通过 kubeadm1.23.5 安装 K8S
CentOS7.9 通过 kubeadm1.23.5 安装 K8S
CentOS7.9 通过 kubeadm1.23.5 安装 K8S
安装前需知
- 撰写本文的目的主要是为了自己保存一份安装方法的记录,只要有网络就可以查找到安装方案,所以本文并不是安装教程。
- 为和我一样的初学都提供一些帮助,但需要大家自己学习本文提到软件的基础知识。
- kubernetes安装方式还是很多的,我这里主要用的是kubeadm安装,其它还有二进制安装、kubekey、rancher等等好多种,如果有可能我把简单的方法在后面写点,二进制就算了,麻烦,不过二进制的说是稳定,以后也可以试试。
- 文中提到的配置与安装方法主要是为学习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地址 | 用户名 | 密码 |
---|---|---|---|---|
master | kube-m1-01 | 172.16.0.51 | root | @@123456abc |
master | kube-m1-02 | 172.16.0.52 | root | @@123456abc |
master | kube-m1-03 | 172.16.0.53 | root | @@123456abc |
worker | kube-n2-0001 | 172.16.0.61 | root | @@123456abc |
worker | kube-n2-0002 | 172.16.0.62 | root | @@123456abc |
worker | kube-n2-0003 | 172.16.0.63 | root | @@123456abc |
主机名称意义以 kube-m1-01 为例:
kube: 项目名称
m: master管理主机,n代表worker节点主机
1:指代管理主机的一种配置,这里用的是2C/4G/40G的配置,最多9种配置
01:指管理主机的序号,这里最多就到99台。
1.3. 软件版本
用途 | 软件名称 | 版本信息 | 备注 |
---|---|---|---|
操作系统 | Centos | 7.9.2009 | |
k8s安装器 | kubeadm | 1.23.5 | |
k8s节点控制器 | kubelet | 1.23.5 | |
k8s命令行工具 | kubectl | 1.23.5 | |
k8s网络插件 | calico | 3.23.1 | |
容器运行管理工具 | docker | 19.03.9-3 | |
k8s通用面板 | dashboard | 2.5.1 | 选装 |
七层代理 | ingress-nginx | 1.2.0 | 选装 |
多集群管理平台 | kuboard | 最新 | 选装 |
共享文件系统 | nfs | 4.0以上 | 选装 |
分布式存储(rook部署) | ceph | 16.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
安装方法自己看了,网页上都有。
注意事项:
- 国内访问 GitHub/Googleapis 受限,要用受限的安装方法
- docker最好提前装好,或配置国内镜像,让kubekey自己装docker
- conntrack没装的必需手动yum装下。
- 配置文件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: []
更多推荐
所有评论(0)