1、k8s安装
一、基础概念
1、kubernetes,简称 K8s,是用8代替8个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多
个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的 应用简单并且高效(powerful),Kubernetes
提供了应用部署,规划,更新,维护的一种机制。
2、kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具,这个工具能通过两条指令完成一个
kubernetes集群的部署。
(1)创建一个 Master 节点
kubeadm init
(2)将一个 Node 节点加入到当前集群中
kubeadm join <Master节点的IP和端口>
二、硬件要求
在开始之前,部署Kubernetes集群机器需要满足以下几个条件:
(1)一台或多台机器,操作系统 CentOS7.x-86_x64
(2)硬件配置:3GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多
(3)可以访问外网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点
(4)禁止swap分区
三、环境准备与规划
1、集群规划
node1 192.168.215.140 (master)
node2 192.168.215.141 (slave)
node3 192.168.215.142 (slave)
2、必要环境准备(3台都执行)
(1) 都关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
(2) 都关闭selinux
setenforce 0 # 临时
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
(3) 都关闭swap
swapoff -a # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
(4) 根据规划设置主机名
hostnamectl set-hostname node1
hostnamectl set-hostname node2
hostnamectl set-hostname node3
(5) 只在master140添加hosts
cat >> /etc/hosts << EOF
192.168.215.140 node1
192.168.215.141 node2
192.168.215.142 node3
EOF
(6) 三台服务器,将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
(7) sysctl --system # 生效
(8) 时间同步
yum install ntpdate -y
ntpdate time.windows.com
(9) 重启所有服务器
四、安装docker并添加yum源
Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker。
4.1 安装docker
3台都需要安装docker
1、使用wget命令下载docker-ce.repo
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
2、安装docker18.06.1版本
yum -y install docker-ce-18.06.1.ce-3.el7
3、设置开机自启,并启动docker
systemctl enable docker && systemctl start docker
4、查看docker版本
docker --version
4.2 设置docker镜像仓库地址
设置docker镜像仓库地址为:阿里巴巴的地址,加速镜像下载
3台都需要设置仓库地址
1、创建文件夹
sudo mkdir -p /etc/docker
2、替换镜像仓库地址
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://p4e9di9t.mirror.aliyuncs.com"]
}
EOF
3、重启docker
systemctl daemon-reload
systemctl restart docker
4.3 设置k8s的YUM源
3台都执行
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
五、安装kubeadm,kubelet和kubectl
1、安装指定版本的1.18,避免兼容性问题
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
2、设置开机自启
systemctl enable kubelet
六、部署K8s Master
6.1 kubeadm初始化并下载镜像
1、在192.168.215.140(Master)执行。
2、service-cidr 和 pod-network-cidr 只要是和当前网段不冲突的ip就可以。
3、由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。
kubeadm init \
--apiserver-advertise-address=192.168.215.140 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
6.2 复制配置文件,并授权
在 140 master上面继续执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
6.3 查看节点
kubectl get nodes
发现只有master一个节点,并且状态是 “未准备”
七、部署K8s Slave
把从节点加入到master当中去,从而组成一个集群,所以接下来的操作基本都是在141/142 从节点上面执行的。
7.1 master生成token
在140 master 节点上面执行如下命令,生成token,从而让其他节点加入进来,默认24h有效
kubeadm token create --print-join-command
7.2 从节点加入master
复制master上面生成的命令,在从节点141/142上面分别执行:
kubeadm join 192.168.215.140:6443 --token bycusu.59ms8jd3eq24762t --discovery-token-ca-cert-hash sha256:27beb79651247a57b6272f27f6e2c6d64085a2130b0103387e4cf0cd2e85e167
7.3 再次查看节点
kubectl get nodes
在master上面执行该命令,发现节点数量增加了2个
八、部署CNI网络插件
1、在master上面执行该命令,需要等待5-10分钟,若失败,多执行几次
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
2、查看详细系统状态 ,需要每个是Running
kubectl get pods -n kube-system
3、查看节点状态,每个node都是reaady
kubectl get nodes
【注】当2和3都是running与ready状态表示cni网络插件已经安装完成
九、测试K8s集群
在Kubernetes集群中创建一个pod,验证是否正常运行:master
1、kubectl create deployment nginx --image=nginx
2、kubectl get pod,svc 查看状态是否为running,然后执行第3步暴露端口
3、kubectl expose deployment nginx --port=80 --type=NodePort
4、kubectl get pod,svc 查看映射端口是多少
访问地址:http://192.168.215.140:32491
十、卸载k8s
kubeadm reset -f
modprobe -r ipip
lsmod
rm -rf ~/.kube/
rm -rf /etc/kubernetes/
rm -rf /etc/systemd/system/kubelet.service.d
rm -rf /etc/systemd/system/kubelet.service
rm -rf /usr/bin/kube*
rm -rf /etc/cni
rm -rf /opt/cni
rm -rf /var/lib/etcd
rm -rf /var/etcd
yum clean all
yum remove kube*
2、nfs默认存储类安装
kubernetes集群配置默认存储类(nfs)
- 查看Kubernetes集群中的默认存储类
kubectl get storageclass
安装nfs服务端
- 找一台新的服务器,作为nfs服务端,然后进行 nfs的安装 【服务器:172.16.11.17】
- 安装nfs
yum install -y nfs-utils
- 创建存放数据的目录
mkdir -p /data/k8s
- 设置挂载路径
# 打开文件
vim /etc/exports
# 添加如下内容
/data/k8s *(rw,no_root_squash)
node节点上安装
- 在k8s集群需要部署应用的node节点安装nfs
yum install -y nfs-utils
启动nfs
- node节点上配置完成后,到nfs服务器启动nfs
systemctl start nfs
配置StorageClass
- 使用StorageClass,需要安装对应的自动配置程序,比如上面我们使用的是nfs,那么我们就需要使用到一个 nfs-client 的自动配置程序,也叫它 Provisioner,这个程序使用我们已经配置的nfs服务器,来自动创建持久卷,也就是自动帮我们创建PV。
自动创建的 PV 以 {pvcName}- {namespace}- {pvName} 这样的命名格式存在 NFS 服务器上。
- 当然在部署nfs-client之前,需要先成功安装上 nfs 服务器,上面已经安装好了,服务地址是172.16.11.17,共享数据目录是/data/k8s/,然后部署 nfs-client 即可。
创建Deployment
- 首先配置 Deployment(nfs-client.yaml)
kind: Deployment
apiVersion: apps/v1
metadata:
name: nfs-client-provisioner
spec:
replicas: 1
selector:
matchLabels:
app: nfs-client-provisioner
strategy:
type: Recreate
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: 172.16.11.17 #替换成自己的nfs服务器
- name: NFS_PATH
value: /data/k8s # 替换成自己的挂载目录
volumes:
- name: nfs-client-root
nfs:
server: 172.16.11.17 #替换成自己的nfs服务器
path: /data/k8s # 替换成自己的挂载目录
创建ServiceAccount
- Deployment使用了一个名为
nfs-client-provisioner
的serviceAccount,所以也需要创建一个 sa,然后绑定上对应的权限。(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
- 新建的一个名为 nfs-client-provisioner 的ServiceAccount,然后绑定了一个名为 nfs-client-provisioner-runner 的ClusterRole,而该ClusterRole声明了一些权限,其中就包括对persistentvolumes的增、删、改、查等权限,所以我们可以利用该ServiceAccount来自动创建 PV。
创建StorageClass对象
- nfs-client 的 Deployment 声明完成后,就可以创建一个StorageClass对象。(nfs-client-class.yaml)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: course-nfs-storage
provisioner: fuseim.pri/ifs
- 声明了一个名为 course-nfs-storage 的StorageClass对象。
- 注意provisioner对应的值一定要和上面的Deployment下面的 PROVISIONER_NAME 这个环境变量的值一样。
创建资源对象
kubectl create -f nfs-client.yaml
kubectl create -f nfs-client-sa.yaml
kubectl create -f nfs-client-class.yaml
- 查看资源状态
kubectl get pods
# 查看存储类
kubectl get storageclass
- 可以设置这个 course-nfs-storage 的 StorageClass 为 Kubernetes 的默认存储后端,我们可以用 kubectl patch 命令来更新。
kubectl patch storageclass course-nfs-storage -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
- 执行完命令后,我们默认存储类就配置成功了。
kubectl get storageclass
常见问题
问题一
- 部署k8s动态持久卷nfs报错如下:
waiting for a volume to be created, either by external provisioner “gxf-nfs-storage” or manually created by system administrator
- 由于Kubernetes 1.20禁用了selfLink,创建的时候会报错。
vi /etc/kubernetes/manifests/kube-apiserver.yaml
- 添加一行内容
- --feature-gates=RemoveSelfLink=false
- 重新应用
kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml
- 持续补充中…
3、# Kubernetes 上最小化安装 KubeSphere
部署 KubeSphere
确保您的机器满足安装的前提条件之后,可以按照以下步骤安装 KubeSphere。
-
执行以下命令开始安装:
kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.1.1/kubesphere-installer.yaml kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.1.1/cluster-configuration.yaml
-
检查安装日志:
kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f
-
使用
kubectl get pod --all-namespaces
查看所有 Pod 是否在 KubeSphere 的相关命名空间中正常运行。如果是,请通过以下命令检查控制台的端口(默认为30880
):kubectl get svc/ks-console -n kubesphere-system
-
确保在安全组中打开了端口
30880
,并通过 NodePort(IP:30880)
使用默认帐户和密码(admin/P@88w0rd)
访问 Web 控制台。 -
登录控制台后,您可以在服务组件中检查不同组件的状态。如果要使用相关服务,可能需要等待某些组件启动并运行。
启用可插拔组件(可选)
本指南仅适用于默认的最小化安装。若要在 KubeSphere 中启用其他组件,请参见启用可插拔组件。