本文内容具有时效性,过于久远时仅供参考

编辑于2022年3月16日,于互联网整理
2022年10月24日修改

本机部署环境:
centos7.9 4c8g
kubernetes1.21
KubeSphere 3.2.1
docker-ce 20.10.13 和 docker-compose 1.29.2 为当时最新

基本环境配置

因为通过yum安装的docker是比较旧的版本,所以需要手动安装最新的docker。
安装必要的一些系统工具

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

添加软件源信息

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

更新并安装docker-CE

sudo yum makecache fast
sudo yum -y install docker-ce

安装docker-compose

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#要安装全其他版本需替换1.29.2为相应版本号
 sudo chmod +x /usr/local/bin/docker-compose #添加docker-compose可执行权限

关闭selinux和交换分区

vi /etc/fstab
# 将swap注释掉,没有swap就不管了
vi /etc/selinux/config #打开selinux的设置文件
#将 SELINUX=enforcing 改为 SELINUX=disabled
# 然后重启

设置hostname

hostnamectl set-hostname k8s-master

设置桥接流量对iptables可见

cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
#验证生效,返回1即为生效
sysctl -n net.bridge.bridge-nf-call-iptables
sysctl -n net.bridge.bridge-nf-call-ip6tables

修改cgroup驱动为systemd[k8s官方推荐]、限制容器日志量、修改存储类型


cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ],
  "registry-mirrors": ["https://mirrors.tuna.tsinghua.edu.cn/"], #该项为docker镜像加速地址,不需要的可以去掉
  "data-root": "/data/docker" #该项为docker的数据存储位置,不需要的可以去掉
}
EOF
#没有/etc/docker/需要手动创建

开启docker服务和设置开机自启动

systemctl enable --now docker
systemctl daemon-reload
systemctl restart docker

部署kubernetes

添加kubernetes源,官网给的源是空的,所以用阿里的

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=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

重建yum缓存,输入y添加证书认证

yum makecache fast #执行后报错,不用管,阿里解释:由于官网未开放同步方式, 可能会有索引gpg检查失败的情况.

安装指定版本的三件套:kubelet kubeadm kubectl

yum install -y --nogpgcheck kubelet-1.21.0-0 --disableexcludes=kubernetes
yum install -y --nogpgcheck kubeadm-1.21.0-0 --disableexcludes=kubernetes
yum install -y --nogpgcheck kubectl-1.21.0-0 --disableexcludes=kubernetes

开启kubelet服务和开机自启

systemctl enable kubelet && systemctl start kubelet

配置bash自动补全命令

#安装bash自动补全插件
yum install bash-completion -y
#设置kubectl与kubeadm命令补全,退出ssh,重新登录生效
kubectl completion bash >/etc/bash_completion.d/kubectl
kubeadm completion bash > /etc/bash_completion.d/kubeadm

初始化kubernetes集群,选需要的执行

kubeadm init \
--apiserver-advertise-address=192.168.50.1 \ #本机IP
--image-repository registry.aliyuncs.com/google_containers \ #指定拉取镜像地址:阿里,国外忽略
--kubernetes-version v1.21.0 \ 指定版本
--service-cidr=10.96.0.0/12 \ #为服务的虚拟 IP 地址另外指定, IP地址段默认10.96.0.0/12
--pod-network-cidr=10.244.0.0/16 #指明 pod 网络可以使用的IP地址段, 10.244.0.0/16是flannel固定使用的IP段,设置取决于网络组件要求

#registry.aliyuncs.com/google_containers 无法使用,所以可以跟换其他地址或者不配置指定镜像地址

#我执行的
kubeadm init --apiserver-advertise-address=192.168.50.1 --kubernetes-version v1.21.0 --pod-network-cidr=10.110.0.0/16 --service-cidr=10.120.0.0/16

非root用户执行

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

root 用户执行

export KUBECONFIG=/etc/kubernetes/admin.conf
#永久添加环境变量
vi /etc/profile.d/kubernetes.sh
#然后写入export KUBECONFIG=/etc/kubernetes/admin.conf,并重新登录

kubeadm 对 admin.conf 中的证书进行签名时,将其配置为 Subject: O = system:masters, CN = kubernetes-admin。 system:masters 是一个例外的、超级用户组,可以绕过鉴权层(例如 RBAC)。 不要将 admin.conf 文件与任何人共享,应该使用 kubeadm kubeconfig user 命令为其他用户生成 kubeconfig 文件,完成对他们的定制授权。

安装网络附加组件

#下载calico网络模板文件
wget https://docs.projectcalico.org/v3.8/manifests/calico.yaml
#修改配置文件,在625行左右的192.168.0.0/16,修改为初始化配置的Ip段,比如我的10.120.0.0/16
vim calico.yaml
#修改好后,进行部署
kubectl apply -f calico.yaml

查看状态,看到状态全部Running就OK了

kubectl get pods --all-namespaces

创建本地存储卷,如果你有远程存储可以挂,可以忽略这个

cat > storage-class.yml <<EOF
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
EOF

#部署
kubectl create -f storage-class.yml

查看存储卷,有个名字叫local-storage的就算创建好了

kubectl get sc

设置默认存储卷

kubectl patch storageclass local-storage  -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

设置master也可以运行pod(单机运行)

kubectl taint nodes --all node-role.kubernetes.io/master-

部署kubesphere

以下安装为官方的最小安装

下载yaml,通过官方文档选择需要的组件.

#下载
wget  https://github.com/kubesphere/ks-installer/releases/download/v3.2.1/kubesphere-installer.yaml
wget  https://github.com/kubesphere/ks-installer/releases/download/v3.2.1/cluster-configuration.yaml
#部署
kubectl apply -f kubesphere-installer.yaml
kubectl apply -f cluster-configuration.yaml

查看安装日志

kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l 'app in (ks-install, ks-installer)' -o jsonpath='{.items[0].metadata.name}') -f

#如果卡住了,执行一下最后面的卸载脚本,然后执行以下代码
#实测建议使用下面这种方式
kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.2.1/kubesphere-installer.yaml

kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.2.1/cluster-configuration.yaml

根据最后的日志输出,登录kubesphere

卸载或重置kubernetes

重置kubeadm 安装状态

#重置kubeadm
kubeadm reset

删除配置文件

rm -rf /etc/kubernetes/*
rm -rf ~/.kube/*
rm -rf /var/lib/etcd/*

卸载

yum remove kubelet
yum remove kubeadm
yum remove kubectl

可选操作

#删除所有镜像
docker rmi $(docker images -q)

遇到的问题

kubernetes安装的时候,如果是用的flannel网络插件,会与contos7的默认防火墙firewalld冲突.在部署kubespere的时候出现以下错误,换 calico就好了

ERROR    : Enable kube events for hooks error: Get "https://10.96.0.1:443/api?timeout=32s": dial tcp 10.96.0.1:443: connect: no route to host

安装完后看到有几个pod一直是pending
然后kubectl describe node 节点名字, 看了下
Allocated resources : (Total limits may be over 100 percent, i.e., overcommitted.)
我又看了眼官网的最低配置1c2g, 并确认我没有选择任何组件
..............
卸载

wget https://raw.githubusercontent.com/kubesphere/ks-installer/release-3.1/scripts/kubesphere-delete.sh && kubesphere-delete.sh