K8s_lab

第一章 k8s install

1.1 该文基于k8s三件套以下版本

kubectl v1.20.1-0
kubeadm v1.20.1-0
kubelet v1.20.1-0


1.2 安装docker

# 安装docker所需的工具
yum install -y yum-utils device-mapper-persistent-data lvm2
# 配置阿里云的docker源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 指定安装这个版本的docker-ce
yum install -y docker-ce-18.09.9-3.el7
# 启动docker
systemctl enable docker && systemctl start docker
language-shell复制代码

1.3 only centos use

# 关闭防火墙
systemctl disable firewalld
systemctl stop firewalld
# 关闭selinux
# 临时禁用selinux
setenforce 0
# 永久关闭 修改/etc/sysconfig/selinux文件设置
sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
# 禁用交换分区
swapoff -a
# 永久禁用,打开/etc/fstab注释掉swap那一行。
sed -i 's/.*swap.*/#&/' /etc/fstab
# 修改内核参数
cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

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
sudo sysctl --system
language-shell复制代码

1.4 更换k8s yum源

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
language-shell复制代码

1.5 安装 k8s三件套

yum install -y kubelet-1.20.1-0 kubeadm-1.20.1-0 kubectl-1.20.1-0 --disableexcludes=kubernetes
systemctl enable --now kubelet
language-shell复制代码

1.6 编辑docker文件

# 创建文件 
vim /etc/docker/daemon.json
# 并写入
{
    "exec-opts": ["native.cgroupdriver=systemd"]
}

1.7 设置docker pull 代理

# 设置docker代理
mkdir -p /etc/systemd/system/docker.service.d
vim proxy.conf
# 输入以下内容
[Service]
Environment="HTTP_PROXY=http://192.168.18.140:8889/"
Environment="HTTPS_PROXY=http://192.168.18.140:8889/"
Environment="NO_PROXY=localhost,127.0.0.1,192.168.18.140"

systemctl daemon-reload
systemctl restart docker

1.8 下载镜像

kubeadm config images pull
# 可能不需要执行下面的命令
docker pull quay.mirrors.ustc.edu.cn/coreos/flannel:v0.14.0
docker tag quay.mirrors.ustc.edu.cn/coreos/flannel:v0.14.0  quay.io/coreos/flannel:v0.14.0
docker rmi quay.mirrors.ustc.edu.cn/coreos/flannel:v0.14.0
language-shell复制代码

1.9 创建集群

# 在master上创建集群
# 192.168.018.200为masteip;10.244.0.0/16为pod地址池;kubeadm-config.yaml是配置 kubelet 的 cgroup 驱动的文件
# kubeadm init --apiserver-advertise-address 192.168.18.200 --pod-network-cidr=10.244.0.0/16 --config kubeadm-config.yaml
kubeadm init --apiserver-advertise-address 192.168.18.200 --pod-network-cidr=10.244.0.0/16
# 接着还需要执行如下命令安装 Pod 网络(这里我们使用 flannel),否则 Pod 之间无法通信。
# https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml需要科学上网才能访问,
# 可在你的电脑访问后,在master服务器上创建kube-flannel.yaml后,粘贴进去。
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

# 查看节点状态,状态必须为ready
kubectl get nodes

# 查看加入集群的命令
kubeadm token create --print-join-command
language-shell复制代码

1.10 其他机器加入集群

# 在其他节点中执行1~8的步骤
# 执行第9步骤中加入集群的命令,类似以下的命令
kubeadm join 192.168.18.200:6443 --token opip9p.rh35kkvqzwjizely --discovery-token-ca-cert-hash sha256:9252e13d2ffd3569c40b02c477f59038fac39aade9e99f282a333c0f8c5d7b22
language-shell复制代码

1.11 测试

# https://raw.githubusercontent.com/kubernetes/website/master/content/en/examples/application/nginx-app.yaml需要科学上网才能访问,
# 可在你的电脑访问后,在master服务器上创建nginx-app.yaml后,粘贴进去。
kubectl apply -f https://raw.githubusercontent.com/kubernetes/website/master/content/en/examples/application/nginx-app.yaml
# 执行如下命令查看副本(pod)情况
kubectl get pods -o wide
# 执行如下命令则可以查看 services 状态。
kubectl get service
language-shell复制代码

第二章 k8s DashBoard

2.1 安装DashBoard

# 用浏览器打开以下文件并复制
# https://kuboard.cn/install-script/k8s-dashboard/v2.0.0-beta5.yaml
# 打开你的电脑创建dashboard.yaml
# 粘贴复制的内容
# 找到以下内容
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 443
      targetPort: 8443
  type: NodePort # 加入这一行,使用NodePort模式
  selector:
    k8s-app: kubernetes-dashboard
language-yaml复制代码

2.2 生成token

kubectl apply -f https://kuboard.cn/install-script/k8s-dashboard/auth.yaml
# 查看token值
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
language-shell复制代码

生成类似以下的内容

Name:         admin-user-token-v57nw
Namespace:    kubernetes-dashboard
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: admin-user
              kubernetes.io/service-account.uid: 0303243c-4040-4a58-8a47-849ee9ba79c1

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1066 bytes
namespace:  20 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXY1N253Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIwMzAzMjQzYy00MDQwLTRhNTgtOGE0Ny04NDllZTliYTc5YzEiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.Z2JrQlitASVwWbc-s6deLRFVk5DWD3P_vjUFXsqVSY10pbjFLG4njoZwh8p3tLxnX_VBsr7_6bwxhWSYChp9hwxznemD5x5HLtjb16kI9Z7yFWLtohzkTwuFbqmQaMoget_nYcQBUC5fDmBHRfFvNKePh_vSSb2h_aYXa8GV5AcfPQpY7r461itme1EXHQJqv-SN-zUnguDguCTjD80pFZ_CmnSE1z9QdMHPB8hoB4V68gtswR1VLa6mSYdgPwCHauuOobojALSaMc3RH7MmFUumAgguhqAkX3Omqd3rJbYOMRuMjhANqd08piDC3aIabINX6gP5-Tuuw2svnV6NYQ
language-shell复制代码

2.3 查看Dashboard运行的端口

kubectl -n kubernetes-dashboard get svc -o wide
NAME                        TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE     SELECTOR
dashboard-metrics-scraper   ClusterIP      10.98.73.37     <none>        8000/TCP        16m     k8s-app=dashboard-metrics-scraper
kubernetes-dashboard        NodePort       10.111.244.42   <none>        443:30307/TCP   16m     k8s-app=kubernetes-dashboard
# 浏览器输入https://node地址:30307(端口)
language-shell复制代码

第三章 kubesphere

3.1 kubesphere 前置要求

Kubernetes 版本必须为:1.17.x、1.18.x、1.19.x 或 1.20.x
确保您的机器满足最低硬件要求:CPU > 1 核,内存 > 2 GB
在安装之前,需要配置 Kubernetes 集群中的默认存储类型


3.2 k8s安装指定的版本

# 查看可安装的k8s版本
yum list kubelet kubeadm kubectl  --showduplicates|sort -r
# k8s安装指定的版本
# Kubernetes 版本必须为:1.17.x、1.18.x、1.19.x 或 1.20.x
# 所以就安装了1.20.x
yum install kubelet-1.20.1-0 kubeadm-1.20.1-0 kubectl-1.20.1-0
language-shell复制代码

3.3 创建存储类型

因为公司只有俩台服务,node节点性能和硬盘较大, 所以在node节点上部署存储服务,使用的是nfs。


3.4 创建nfs服务端

#创建共享目录,(目录可自定义)
mkdir -p /data/kubernetes
# 安装组件
yum -y install nfs-utils rpcbind
# 编辑配置文件
vim /etc/exports
# 写入内容如下
/data/kubernetes 192.168.18.0/24(rw,sync,no_root_squash)
# 这里的192.168.18.0/24,表示客户端访问白名单。只有符合的ip,才能访问
# 启动nfs服务
service nfs start
service rpcbind start
# 设置开机启动
systemctl enable nfs
systemctl enable rpcbind
language-shell复制代码

3.5 客户端使用nfs

在master安装nfs客户端

# 登录主机k8s-master,创建目录
mkdir nfsvolume
# 下载yaml文件
https://raw.githubusercontent.com/kubernetes-incubator/external-storage/master/nfs-client/deploy/rbac.yaml
https://raw.githubusercontent.com/kubernetes-incubator/external-storage/master/nfs-client/deploy/class.yaml
https://raw.githubusercontent.com/kubernetes-incubator/external-storage/master/nfs-client/deploy/deployment.yaml
# 修改 deployment.yaml 中的两处 NFS 服务器 IP 和目录
...
          env:
            - name: PROVISIONER_NAME
              value: fuseim.pri/ifs
            - name: NFS_SERVER
              value: 192.168.18.199
            - name: NFS_PATH
              value: /data/kubernetes
      volumes:
        - name: nfs-client-root
          nfs:
            server: 192.168.18.199
            path: /data/kubernetes
# 部署创建
kubectl create -f rbac.yaml
kubectl create -f class.yaml
kubectl create -f deployment.yaml
language-shell复制代码
# 每个节点都要安装nfs-tuils
yum -y install nfs-utils
# 在master执行
kubectl get storageclass
# 以下是终端打印示例内容
NAME                            PROVISIONER      AGE
managed-nfs-storage    fuseim.pri/ifs   139m
# 查看nfs pod, 确保状态正常
kubectl get pods
NAME                                      READY   STATUS    RESTARTS   AGE
nfs-client-provisioner-59777fb457-dkf87   1/1     Running   0          153m
# 标记一个默认的StorageClass
# 最多只有一个StorageClass能够标记为默认
kubectl patch storageclass managed-nfs-storage -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

# 验证标记是否成功
kubectl get storageclass
NAME                            PROVISIONER      AGE
managed-nfs-storage (default)   fuseim.pri/ifs   139m
language-shell复制代码

3.6 安装kubeSphere

# 安装的kubesphere 3.1.1
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 控制台。
language-shell复制代码

第四章 error

4.1 关于prometheus-k8s-0 启动失败,一直 pending 状态。

虽然kubesphere安装成功,但是健康检测服务可能没起来
主要原因是没有pvc
参考连接

# 创建pvc
vim pvc.yaml
# 写入以下内容
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: test-pvc
  annotations:
    volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 21Gi
# 执行pvc.yaml
kubectl create -f pvc.yaml
# 验证是否成功
kubectl get pvc
language-shell复制代码

修改/etc/kubernetes/manifests/kube-apiserver.yaml

# 在以下内容
spec:
  containers:
  - command:
    - kube-apiserver
# 加入这行
- --feature-gates=RemoveSelfLink=false
# 执行
kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml
language-yaml复制代码

4.2 cni0问题

# 可以使用类似以下的命令查看pod的运行描述信息
kubectl describe pod coredns-*** -n kube-system
# 发现报错信息为类似"network: failed to set bridge addr: "cni0" already has an IP address different from 10.244.0.1/24"
language-shell复制代码

解决办法

该方法会重置集群!!!!!该方法会重置集群!!!!!该方法会重置集群!!!!!该方法会重置集群!!!!!

# 在所有节点(master和slave节点)删除cni0,以及暂停k8s和docker。
kubeadm reset 
systemctl stop kubelet
systemctl stop docker
rm -rf /var/lib/cni/
rm -rf /var/lib/kubelet/
rm -rf /etc/cni/
ifconfig cni0 down
ifconfig flannel.1 down
ifconfig docker0 down
ip link delete cni0
ip link delete flannel.1
# 在所有节点重启kubelet和docker
systemctl start kubelet
systemctl start docker
# 重新创建集群
language-shell复制代码


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以邮件至 hjxstart@126.com