# Kubernetes ## minikube 1. 安装步骤https://minikube.sigs.k8s.io/docs/start/ 2. 启动k8s集群
1
minikube start
3. 启动仪表盘
1
minikube dashboard
4. 查看启动插件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
minikube addons list

addon-manager: enabled
dashboard: enabled
default-storageclass: enabled
efk: disabled
freshpod: disabled
gvisor: disabled
helm-tiller: disabled
ingress: disabled
ingress-dns: disabled
logviewer: disabled
metrics-server: disabled
nvidia-driver-installer: disabled
nvidia-gpu-device-plugin: disabled
registry: disabled
registry-creds: disabled
storage-provisioner: enabled
storage-provisioner-gluster: disabled

minikube addons enable metrics-server


启动插件后kube-system 会安装相应的controller
kubectl get pod,svc -n kube-system
NAME READY STATUS RESTARTS AGE
pod/coredns-5644d7b6d9-mh9ll 1/1 Running 0 34m
pod/coredns-5644d7b6d9-pqd2t 1/1 Running 0 34m
pod/metrics-server-67fb648c5 1/1 Running 0 26s
pod/etcd-minikube 1/1 Running 0 34m
pod/influxdb-grafana-b29w8 2/2 Running 0 26s
pod/kube-addon-manager-minikube 1/1 Running 0 34m
pod/kube-apiserver-minikube 1/1 Running 0 34m
pod/kube-controller-manager-minikube 1/1 Running 0 34m
pod/kube-proxy-rnlps 1/1 Running 0 34m
pod/kube-scheduler-minikube 1/1 Running 0 34m
pod/storage-provisioner 1/1 Running 0 34m

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/metrics-server ClusterIP 10.96.241.45 <none> 80/TCP 26s
service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP 34m
service/monitoring-grafana NodePort 10.99.24.54 <none> 80:30002/TCP 26s
service/monitoring-influxdb ClusterIP 10.111.169.94 <none> 8083/TCP,8086/TCP 26s

minikube addons disable metrics-server

4. 关闭集群
1
minikube stop
5. 删除虚拟机
1
minikube delete
## 单机安装 关于单机安装 `k8s`,我使用的相关环境如下(于2022-08-13更新): - macOS:Monterey 12.4 - Docker Desktop Vesion:4.11.1 - Kubernetes:v1.24.2 由于镜像的下载涉及到网络原因,因此这里使用了开源项目[k8s-docker-desktop-for-mac](https://github.com/gotok8s/k8s-docker-desktop-for-mac)来解决这个问题,需要注意的是要修改 `images`的相关镜像的版本,要和此时 `Kubernetes`配对上才行,比如我设置的是:
1
2
3
4
5
6
7
k8s.gcr.io/kube-proxy:v1.24.2=gotok8s/kube-proxy:v1.24.2
k8s.gcr.io/kube-controller-manager:v1.24.2=gotok8s/kube-controller-manager:v1.24.2
k8s.gcr.io/kube-scheduler:v1.24.2=gotok8s/kube-scheduler:v1.24.2
k8s.gcr.io/kube-apiserver:v1.24.2=gotok8s/kube-apiserver:v1.24.2
k8s.gcr.io/pause:3.7=gotok8s/pause:3.7
k8s.gcr.io/coredns/coredns:v1.8.6=gotok8s/coredns:v1.8.6
k8s.gcr.io/etcd:3.5.3-0=gotok8s/etcd:3.5.3-0
然后执行 `./load_images.sh `即可下载k8s依赖的镜像,随后打开 `Docker`,进入设置界面,勾选 `Enable Kubernetes`即可: ![](/note_image/kubenets/image/2023-08-09-14-11-04.png) 不出意外,界面左下角会出现 `Kubernetes running`的提示,这样就安装成功了。 每个人的 `Docker` 版本都有差别,不同版本如何查找各个依赖容器对应的版本呢?参考一下命令:
1
2
3
4
5
KUBERNETES_VERSION=v1.24.2
# Linux 下执行
curl -O -L https://storage.googleapis.com/kubernetes-release/release/${KUBERNETES_VERSION}/bin/linux/amd64/kubeadm
chmod +x kubeadm
./kubeadm config images list --kubernetes-version=${KUBERNETES_VERSION}
版本号那里填写你自己的当前版本即可,不出意外可以得到如下输出:
1
2
3
4
5
6
7
k8s.gcr.io/kube-apiserver:v1.24.2
k8s.gcr.io/kube-controller-manager:v1.24.2
k8s.gcr.io/kube-scheduler:v1.24.2
k8s.gcr.io/kube-proxy:v1.24.2
k8s.gcr.io/pause:3.7
k8s.gcr.io/etcd:3.5.3-0
k8s.gcr.io/coredns/coredns:v1.8.6
查看集群信息:
1
kubectl cluster-info
输出:
1
2
3
4
Kubernetes control plane is running at https://kubernetes.docker.internal:6443
CoreDNS is running at https://kubernetes.docker.internal:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
1
kubectl get nodes
输出: 查看节点信息:
1
kubectl get nodes
输出:
1
2
NAME             STATUS   ROLES           AGE   VERSION
docker-desktop Ready control-plane 11m v1.24.2
单机版本的 `k8s`安装成功!接下来介绍集群安装。 ## 集群安装 #### 准备 - 准备三台机器,比如(使用的配置是4核8G,IP换成你自己的): - 192.168.5.91:Master: - 执行: - `hostnamectl set-hostname master` - `echo "127.0.0.1 $(hostname)" >> /etc/hosts` - 192.168.5.92:Node01 - 执行: - `hostnamectl set-hostname node01` - `echo "127.0.0.1 $(hostname)" >> /etc/hosts` - 192.168.5.93:Node02 - 执行: - `hostnamectl set-hostname node02` - `echo "127.0.0.1 $(hostname)" >> /etc/hosts` - Kubernetes版本:v1.19.3 - Docker版本:19.03.12 开始前请检查以下事项: - **CentOS 版本**:>= 7.6 - **CPU**:>=2 - *IP*:互通 - 关闭**swap**:`swapoff -a` 配置国内kubernetes源:
1
2
3
4
5
6
7
8
9
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=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
安装相关依赖工具:
1
2
3
4
5
yum install -y kubelet-1.19.3 kubeadm-1.19.3 kubectl-1.19.3
# 设置开机启动
systemctl enable kubelet.service && systemctl start kubelet.service
# 查看状态
systemctl status kubelet.service
#### 初始化Master 在主节点(`192.168.5.91`)执行以下命令:
1
2
3
4
export MASTER_IP=192.168.5.91
export APISERVER_NAME=apiserver.demo
export POD_SUBNET=10.100.0.1/16
echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts
新建脚本 `init_master.sh`:
1
vim init_master.sh
添加:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/bin/bash

# 只在 master 节点执行

# 脚本出错时终止执行
set -e

if [ ${#POD_SUBNET} -eq 0 ] || [ ${#APISERVER_NAME} -eq 0 ]; then
echo -e "\033[31;1m请确保您已经设置了环境变量 POD_SUBNET 和 APISERVER_NAME \033[0m"
echo 当前POD_SUBNET=$POD_SUBNET
echo 当前APISERVER_NAME=$APISERVER_NAME
exit 1
fi


# 查看完整配置选项 https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2
rm -f ./kubeadm-config.yaml
cat <<EOF > ./kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
# k8s 版本
kubernetesVersion: v1.19.3
imageRepository: registry.aliyuncs.com/k8sxio
controlPlaneEndpoint: "${APISERVER_NAME}:6443"
networking:
serviceSubnet: "10.96.0.0/16"
podSubnet: "${POD_SUBNET}"
dnsDomain: "cluster.local"
EOF

# kubeadm init
# 根据您服务器网速的情况,您需要等候 3 - 10 分钟
kubeadm config images pull --config=kubeadm-config.yaml
kubeadm init --config=kubeadm-config.yaml --upload-certs

# 配置 kubectl
rm -rf /root/.kube/
mkdir /root/.kube/
cp -i /etc/kubernetes/admin.conf /root/.kube/config

# 安装 calico 网络插件
# 参考文档 https://docs.projectcalico.org/v3.13/getting-started/kubernetes/self-managed-onprem/onpremises
echo "安装calico-3.13.1"
rm -f calico-3.13.1.yaml
wget https://kuboard.cn/install-script/calico/calico-3.13.1.yaml
kubectl apply -f calico-3.13.1.yaml
如果出错:
1
2
3
4
5
# issue 01
# [ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
# 所有机器执行
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
检查 `master`初始化结果:
1
2
3
4
# 直到所有的容器组处于 Running 状态
watch kubectl get pod -n kube-system -o wide
# 查看 master 节点初始化结果
kubectl get nodes -o wide
如下图: ![image-20201221165311482](https://images-1252557999.file.myqcloud.com/uPic/image-20201221165311482.png) #### 获得join命令参数 直接在 `master`执行:
1
kubeadm token create --print-join-command
比如此时输出:
1
2
# 有效期两小时
kubeadm join apiserver.demo:6443 --token vh5hl9.9fccw1mzfsmsp4gh --discovery-token-ca-cert-hash sha256:6970397fdc6de5020df76de950c9df96349ca119f127551d109430c114b06f40
#### 初始化Node 在所有 `node`执行:
1
2
3
4
5
6
export MASTER_IP=192.168.5.91
export APISERVER_NAME=apiserver.demo
echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts

# 替换为 master 节点上 kubeadm token create 命令的输出
kubeadm join apiserver.demo:6443 --token vh5hl9.9fccw1mzfsmsp4gh --discovery-token-ca-cert-hash sha256:6970397fdc6de5020df76de950c9df96349ca119f127551d109430c114b06f40
#### 检查初始化结果 在 `master`节点执行:
1
kubectl get nodes -o wide
输出结果如下: ![image-20201221181016264](https://images-1252557999.file.myqcloud.com/uPic/image-20201221181016264.png) ## sealos 快速安装 经过上面的流程,相信你也能体会到集群部署的麻烦,为了简化这个流程,`Github`上诞生了不少优秀的项目来简化安装流程,接下来以[sealos](https://github.com/fanux/sealos)为例进行命令行一键安装。 #### 准备 资源相关以集群安装配置为主,其中集群安装的准备工作也一样做,其他要求如下: - ssh 可以访问各安装节点 - 各节点主机名不相同,并满足kubernetes的主机名要求。 - 各节点时间同步 - 网卡名称如果是不常见的,建议修改成规范的网卡名称, 如(eth.*|en.*|em.*) - kubernetes1.20+ 使用containerd作为cri. 不需要用户安装docker/containerd. sealos会安装1.3.9版本containerd。 - kubernetes1.19及以下 使用docker作为cri。 也不需要用户安装docker。 sealos会安装1.19.03版本docker 依赖包:
1
2
3
yum install socat -y
yum remove docker-ce containerd.io -y
rm /etc/containerd/config.toml
#### 安装 选一台服务器,我选择安装 `v1.22.0`版本,执行命令即可:
1
sealos init --passwd 'pwd' --master 192.168.5.91  --node 192.168.5.92  --node 192.168.5.93 --pkg-url /root/kube1.22.0.tar.gz --version v1.22.0
#### 检查初始化结果 在 `master`节点执行:
1
kubectl get nodes -o wide
输出结果如下: ![IE2ZfQ](https://images-1252557999.file.myqcloud.com/uPic/IE2ZfQ.png) ## UI ### Kubernetes Dashboard [Dashboard](https://github.com/kubernetes/dashboard)可以将容器化应用程序部署到 `Kubernetes`集群,对容器化应用程序进行故障排除,以及管理集群资源。 #### 安装 安装命令如下:
1
2
3
4
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.6.1/aio/deploy/recommended.yaml -O dashboard.yaml

kubectl apply -f dashboard.yaml
kubectl -n kubernetes-dashboard get pods -o wide
查看是否成功:
1
2
3
NAME                                        READY   STATUS    RESTARTS   AGE   IP         NODE             NOMINATED NODE   READINESS GATES
dashboard-metrics-scraper-8c47d4b5d-mfb6d 1/1 Running 0 83s 10.1.0.7 docker-desktop <none> <none>
kubernetes-dashboard-6c75475678-bdwtn 1/1 Running 0 83s 10.1.0.6 docker-desktop <none> <none>
如果执行完发现 `STATUS`有 `ContainerCreating`,可以查看日志找找原因(注意NAME):
1
kubectl describe pod dashboard-metrics-scraper-8c47d4b5d-mfb6d --namespace=kubernetes-dashboard
一般都是因为 `metrics-scraper:v1.0.8`镜像下载不下来,可以手动执行下载:
1
docker pull kubernetesui/metrics-scraper:v1.0.8
拉下来之后就妥了,还有一个问题就是选用的服务类型是 `ClusterIP`(默认类型,服务只能够在集群内部可以访问),所以我们需要将访问形式改为 `NodePort`(通过每个 Node 上的 IP 和静态端口访问):
1
2
kubectl --namespace=kubernetes-dashboard edit service kubernetes-dashboard
# 将里面的 type: ClusterIP 改为 type: NodePort
保存后,执行:
1
kubectl --namespace=kubernetes-dashboard get service kubernetes-dashboard
终端输出:
1
2
NAME                   TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
kubernetes-dashboard NodePort 10.110.197.167 <none> 443:32171/TCP 7m32s
#### Token 在浏览器访问[https://0.0.0.0:32171/](https://0.0.0.0:32171/): ![image-20201220201125802](https://images-1252557999.file.myqcloud.com/uPic/image-20201220201125802.png) 看界面需要生成 `Token`:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
vim admin-user.yaml
# 输入
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
# 保存退出
vim admin-user-role-binding.yaml
# 输入
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
# 保存退出

# 执行命令加载配置
kubectl -n kubernetes-dashboard create -f admin-user.yaml
kubectl -n kubernetes-dashboard create -f admin-user-role-binding.yaml

# 若出现已存在
# 执行:kubectl -n kubernetes-dashboard delete -f xxx.yaml 即可
获取令牌:
1
kubectl -n kubernetes-dashboard create token admin-user
复制 `token`到刚才的界面登录即可,登录后界面如下: ![image-20201220201512486](https://images-1252557999.file.myqcloud.com/uPic/image-20201220201512486.png) 如果想延长 `Token`的有效时间: ![image-20201221204143993](https://images-1252557999.file.myqcloud.com/uPic/image-20201221204143993.png) 然后在 `containners->args`加上 `--token-ttl=43200`: ![g2tpdz](https://images-1252557999.file.myqcloud.com/uPic/g2tpdz.png) 通过 `kubectl edit deployment kubernetes-dashboard -n kubernetes-dashboard `修改也行。 ### KubePi > KubePi 是一个现代化的 K8s 面板,其允许管理员导入多个 Kubernetes 集群,并且通过权限控制,将不同 Cluster、Namespace 的权限分配给指定用户。 使用 `Docker`安装如下:
1
docker run --privileged -d --restart always -v "`pwd`:/var/lib/kubepi" --name=kubepi --restart=unless-stopped -p 8080:80 kubeoperator/kubepi-server
然后打开[KubePi地址](http://localhost:8080/),输入用户名@密码 `admin@kubepi`登录,登陆成功后设置 `k8s`配置(集群列表->导入): ![13071660388227_.pic](https://images-1252557999.file.myqcloud.com/uPic/13071660388227_.pic.jpg) 其中配置获取方式如下:
1
cat ~/.kube/config
确认后,进入集群就可以开始进行管理: ![kubepi](https://images-1252557999.file.myqcloud.com/uPic/kubepi.jpg) ## 部署镜像 下拉一个你自己想部署的镜像,具体命令如下(主节点执行):
1
2
3
4
5
6
7
8
9
# 部署
kubectl run hello --image=xxx/hello --port=5000
# 列出 pod
kubectl get pods
# 创建一个服务对象
# NodePort 在所有节点(虚拟机)上开放一个特定端口,任何发送到该端口的流量都被转发到对应服务
kubectl expose po hello --port=5000 --target-port=5000 --type=NodePort --name hello-http
# 列出服务
kubectl get services
## MINIKUBE https://minikube.sigs.k8s.io/docs/start/ ## 参考 本部分内容有参考如下文章: - [使用kubeadm安装kubernetes_v1.19.x](https://kuboard.cn/install/install-k8s.html#%E6%A3%80%E6%9F%A5-centos-hostname) - [Web基础配置篇(十六): Kubernetes集群的安装使用](https://www.pomit.cn/p/2366402025269761#1010602) - [Kubernetes架构](https://jimmysong.io/kubernetes-handbook/concepts/) - [深入剖析Kubernetes](https://time.geekbang.org/column/intro/100015201?code=UhApqgxa4VLIA591OKMTemuH1%2FWyLNNiHZ2CRYYdZzY%3D):入门篇以及集群搭建部分 - Kubernetes in Action中文版:第1、2章 `k8s`开源安装方案: - [kubeasz](https://github.com/easzlab/kubeasz):使用Ansible脚本安装K8S集群,介绍组件交互原理,方便直接,不受国内网络环境影响 - [sealos](https://github.com/fanux/sealos):一条命令离线安装高可用kubernetes,3min装完,700M,100年证书,生产环境稳如老狗 - [follow-me-install-kubernetes-cluster](https://github.com/opsnull/follow-me-install-kubernetes-cluster):和我一步步部署 kubernetes 集群 [^1]: k8s项目的基础特性是 Google 公司在容器化基础设施领域多年来实践经验的沉淀与升华,`k8s`和 `Swarm&Mesos`的竞争有兴趣可自行查询详细看看。