# 本地单机架构minikube

https://developer.aliyun.com/article/221687?spm=a2c6h.14164896.0.0.77987bd58zJvgm

kubectl版本要高于k8s版本



## 1.安装kubectl

![image-20221114230420066](https://note-1308251438.cos.ap-guangzhou.myqcloud.com/typora/202211142304204.png)

![image-20221114230447253](https://note-1308251438.cos.ap-guangzhou.myqcloud.com/typora/202211142304388.png)

下载kubectl

```
[root@k8s-master ~]# curl -LO https://dl.k8s.io/release/v1.22.3/bin/linux/amd64/kubectl
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   138  100   138    0     0    330      0 --:--:-- --:--:-- --:--:--   330
100 42.9M  100 42.9M    0     0  17.3M      0  0:00:02  0:00:02 --:--:-- 29.1M
```

添加到系统变量

```
[root@k8s-master ~]# cp kubectl /usr/bin
[root@k8s-master ~]# chmod +x /usr/bin/kubectl
[root@k8s-master ~]# kubectl version 	#能执行命令，则证明已成功安装

```





## 2.安装docker

略



## 3.安装minikube

下载minkube

方法1：github下载

![image-20221114233702667](https://note-1308251438.cos.ap-guangzhou.myqcloud.com/typora/202211142337829.png)

```
[root@k8s-master ~]# wget https://github.com/kubernetes/minikube/releases/download/v1.28.0/minikube-linux-amd64

[root@k8s-master ~]# cp minikube-linux-amd64 /usr/bin/minikube
[root@k8s-master ~]# chmod +x /usr/bin/minikube
```

方法2：用curl下载

![image-20221115094542329](https://note-1308251438.cos.ap-guangzhou.myqcloud.com/typora/202211150945434.png)

```
指定版本需要将链接的latest改为v1.24.0

[root@k8s-master ~]# curl -LO https://storage.googleapis.com/minikube/releases/v1.24.0/minikube-linux-amd64
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 66.3M  100 66.3M    0     0  22.8M      0  0:00:02  0:00:02 --:--:-- 22.8M

[root@k8s-master ~]# mv minikube-linux-amd64 minikube
[root@k8s-master ~]# chmod +x minikube 
[root@k8s-master ~]# ./minikube version
minikube version: v1.24.0
commit: 76b94fb3c4e8ac5062daf70d60cf03ddcc0a741b

```





启动minikube

```
[root@k8s-master ~]# minikube start --image-mirror-country='cn'
* Centos 7.4.1708 上的 minikube v1.28.0
* Unable to pick a default driver. Here is what was considered, in preference order:
  - docker: Not healthy: docker version is less than the minimum required
  - docker: Suggestion: Upgrade Docker to a newer version (Minimum recommended version is 20.10.0, minimum supported version is 18.09.0, current version is 18.06.3-ce) <https://minikube.sigs.k8s.io/docs/drivers/docker/#requirements>
* Alternatively you could install one of these drivers:
  - kvm2: Not installed: exec: "virsh": executable file not found in $PATH
  - podman: Not installed: exec: "podman": executable file not found in $PATH
  - vmware: Not installed: exec: "docker-machine-driver-vmware": executable file not found in $PATH
  - virtualbox: Not installed: unable to find VBoxManage in $PATH
  - qemu2: Not installed: exec: "qemu-system-x86_64": executable file not found in $PATH

X Exiting due to DRV_DOCKER_NOT_RUNNING: Found docker, but the docker service isn't running. Try restarting the docker service.

```

报错1：Found docker, but the docker service isn't running. Try restarting the docker service.

原因：主要是minikube需要的docker版本高于现安装的版本

解决方案：1.清理现有的minikube环境

​					2.安装minikube所需要的docker版本

```
我选择第一个方案
[root@k8s-master ~]# minikube delete	#删除现有虚机,安装k8s过程出现问题，需要重新操作
! “minikube”配置文件不存在时，仍然会尝试
* Removed all traces of the "minikube" cluster.

删除 ~/.minikube 目录缓存的文件
[root@k8s-master ~]# ll -a |grep minikube
drwxr-xr-x  10 root root      117 11月 14 23:42 .minikube
-rwxr-xr-x   1 root root 76750347 11月  5 04:58 minikube-linux-amd64
[root@k8s-master ~]# rm -rf ~/.minikube

重新下载1.24版本
[root@k8s-master ~]# wget https://github.com/kubernetes/minikube/releases/download/v1.24.0/minikube-linux-amd64
[root@k8s-master ~]# chmod +x minikube-linux-amd64
[root@k8s-master ~]# cp minikube-linux-amd64 /usr/bin/minikube

```

重新启动minikube

```
[root@k8s-master opt]# minikube start --image-mirror-country='cn'
* Centos 7.4.1708 上的 minikube v1.24.0
* 自动选择 docker 驱动。其他选项：ssh, none
! For improved Docker performance, Upgrade Docker to a newer version (Minimum recommended version is 18.09.0)
* The "docker" driver should not be used with root privileges.
* If you are running minikube within a VM, consider using --driver=none:
*   https://minikube.sigs.k8s.io/docs/reference/drivers/none/

X Exiting due to DRV_AS_ROOT: The "docker" driver should not be used with root privileges.
```

报错2：The "docker" driver should not be used with root privileges.

原因：从1.5.0版本开始，Minikube缺省使用系统优选的驱动来创建Kubernetes本地环境，docker官网提出如果使用root权限，会有安全隐患

解决方案：使用“--vm-driver=none”，不选择驱动来创建Kubernetes本地环境



```
[root@k8s-master ~]# minikube start --image-mirror-country='cn' --driver=none
* Centos 7.4.1708 上的 minikube v1.24.0
* 根据用户配置使用 none 驱动程序

X Exiting due to GUEST_MISSING_CONNTRACK: Sorry, Kubernetes 1.22.3 requires conntrack to be installed in root's path
```

报错3：Sorry, Kubernetes 1.22.3 requires conntrack to be installed in root's path

解决方案：安装conntrack

```
[root@k8s-master ~]# yum install conntrack -y
```

重新启动minikube

报错4：/proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1

解决方案：设置此文件内容为1

```
[root@k8s-master ~]# minikube start --image-mirror-country='cn' --driver=none
	[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1

[root@k8s-master ~]# echo 1 >/proc/sys/net/bridge/bridge-nf-call-iptables

```





## 4.安装k8s

注：可省略，这样安装会默认安装最新版

```
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 install -y kubelet kubeadm kubectl				#kubectl如果之前安装过，可以不安装
systemctl enable kubelet && systemctl start kubelet
```



重新启动minikube

```
[root@k8s-master ~]# minikube start --image-mirror-country='cn' --vm-driver=none
```

注：minikube不同的版本会默认安装指定的k8s版本，如minikube1.24.0安装k8s版本为1.22.3



## 5.验证安装是否成功

```
[root@k8s-master ~]# kubectl get pod -n kube-system
NAME                                 READY   STATUS    RESTARTS   AGE
coredns-7d89d9b6b8-pvhgc             1/1     Running   0          7m40s
etcd-k8s-master                      1/1     Running   0          7m54s
kube-apiserver-k8s-master            1/1     Running   0          7m54s
kube-controller-manager-k8s-master   1/1     Running   0          7m54s
kube-proxy-89zqp                     1/1     Running   0          7m41s
kube-scheduler-k8s-master            1/1     Running   0          7m54s
storage-provisioner                  1/1     Running   0          7m53s
```





## 6.k8s命令使用

```sh
[root@k8s-master ~]# kubectl get node			#可缩写kubectl get no
NAME         STATUS   ROLES                  AGE   VERSION
k8s-master   Ready    control-plane,master   42m   v1.22.3			#control-plane监控节点，以前是放在etcd节点

[root@k8s-master ~]# kubectl get namespace		#可缩写kubectl get ns
NAME              STATUS   AGE
default           Active   47m
kube-node-lease   Active   47m
kube-public       Active   47m
kube-system       Active   47m

[root@k8s-master ~]# kubectl get service 	#可缩写kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   49m


[root@k8s-master ~]# kubectl get pod						#不指定，默认用default命名空间
No resources found in default namespace.
[root@k8s-master ~]# kubectl get pod -n kube-system			#-n参数指定命名空间
NAME                                 READY   STATUS    RESTARTS   AGE
coredns-7d89d9b6b8-pvhgc             1/1     Running   0          56m
etcd-k8s-master                      1/1     Running   0          56m
kube-apiserver-k8s-master            1/1     Running   0          56m
kube-controller-manager-k8s-master   1/1     Running   0          56m
kube-proxy-89zqp                     1/1     Running   0          56m
kube-scheduler-k8s-master            1/1     Running   0          56m
storage-provisioner                  1/1     Running   0          56m

[root@k8s-master ~]# docker ps 
[root@k8s-master ~]# docker images

[root@k8s-master ~]# kubectl describe pod coredns-7d89d9b6b8-pvhgc -n kube-system		#列出详细信息


[root@k8s-master ~]# kubectl logs kube-proxy-89zqp -n kube-system				#查看某一pod日志
I1114 16:21:35.781421       1 node.go:172] Successfully retrieved node IP: 192.168.245.210
I1114 16:21:35.781447       1 server_others.go:140] Detected node IP 192.168.245.210
W1114 16:21:35.781463       1 server_others.go:565] Unknown proxy mode "", assuming iptables proxy
I1114 16:21:35.801943       1 server_others.go:206] kube-proxy running in dual-stack mode, IPv4-primary
I1114 16:21:35.801957       1 server_others.go:212] Using iptables Proxier.
I1114 16:21:35.801962       1 server_others.go:219] creating dualStackProxier for iptables.
W1114 16:21:35.801971       1 server_others.go:495] detect-local-mode set to ClusterCIDR, but no IPv6 cluster CIDR defined, , defaulting to no-op detect-local for IPv6
I1114 16:21:35.802179       1 server.go:649] Version: v1.22.3
I1114 16:21:35.803124       1 config.go:224] Starting endpoint slice config controller
I1114 16:21:35.803132       1 shared_informer.go:240] Waiting for caches to sync for endpoint slice config
I1114 16:21:35.803165       1 config.go:315] Starting service config controller
I1114 16:21:35.803168       1 shared_informer.go:240] Waiting for caches to sync for service config
I1114 16:21:35.903996       1 shared_informer.go:247] Caches are synced for service config 
I1114 16:21:35.904040       1 shared_informer.go:247] Caches are synced for endpoint slice config

[root@k8s-master ~]# iptables -L 

[root@k8s-master ~]# kubectl edit pod kube-proxy-89zqp -n kube-system			#查看控制器yaml文件

[root@k8s-master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   87m
[root@k8s-master ~]# kubectl edit svc kubernetes						#查看SVC的yaml文件


[root@k8s-master ~]# kubectl get pod kube-proxy-89zqp -n kube-system -o yaml >kube-proxy.ymal		#导出控制器yaml文件


[root@k8s-master ~]# vim nginx.yaml										#创建控制器yaml文件
[root@k8s-master ~]# kubectl apply -f nginx.yaml 						#生成pod
deployment.apps/nginx-deployment created


[root@k8s-master ~]# kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-66b6c48dd5-5jzgr   1/1     Running   0          112s
nginx-deployment-66b6c48dd5-jvqq4   1/1     Running   0          112s
nginx-deployment-66b6c48dd5-vcs7c   1/1     Running   0          112s
[root@k8s-master ~]# kubectl delete pod nginx-deployment-66b6c48dd5-5jzgr	#删除pod
pod "nginx-deployment-66b6c48dd5-5jzgr" deleted
[root@k8s-master ~]# kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-66b6c48dd5-8j6z6   1/1     Running   0          3s					
nginx-deployment-66b6c48dd5-jvqq4   1/1     Running   0          2m13s
nginx-deployment-66b6c48dd5-vcs7c   1/1     Running   0          2m13s

[root@k8s-master ~]# kubectl delete -f nginx.yaml 		#彻底删除	-f 接控制器文件		
deployment.apps "nginx-deployment" deleted
[root@k8s-master ~]# kubectl get pod
No resources found in default namespace.


展示热更新

先启动容器
[root@k8s-master ~]# kubectl apply -f nginx.yaml 
deployment.apps/nginx-deployment created
[root@k8s-master ~]# vim nginx.yaml 	  #修改nginx.yaml文件，更改镜像
改：image: nginx:1.14.2
为：image: nginx:1.18.0
[root@k8s-master ~]# watch -n1 kubectl get pod
```

![image-20221115150302401](https://note-1308251438.cos.ap-guangzhou.myqcloud.com/typora/202211151503471.png)



```sh 
修改nginx.yaml文件，添加service(官方写法)
[root@k8s-master ~]# vim nginx.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
........

[root@k8s-master ~]# kubectl apply -f nginx.yaml 
service/nginx created
deployment.apps/nginx-deployment created
[root@k8s-master ~]# kubectl get po
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-66b6c48dd5-c8zlm   1/1     Running   0          22s
nginx-deployment-66b6c48dd5-crlxz   1/1     Running   0          22s
nginx-deployment-66b6c48dd5-hc4ft   1/1     Running   0          22s
[root@k8s-master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP   112m
nginx        ClusterIP   10.104.121.6   <none>        80/TCP    7s

访问nginx
[root@k8s-master ~]# curl 10.104.121.6
curl: (7) Failed connect to 10.104.121.6:80; 拒绝连接			#ClusterIP只能在集群内部访问





修改nginx.yaml文件，使用nodeport类型
[root@k8s-master ~]# vim nginx.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30007
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
........


[root@k8s-master ~]# kubectl apply -f nginx.yaml 
service/nginx created
deployment.apps/nginx-deployment created

[root@k8s-master ~]# kubectl get po
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-66b6c48dd5-c8zlm   1/1     Running   0          22s
nginx-deployment-66b6c48dd5-crlxz   1/1     Running   0          22s
nginx-deployment-66b6c48dd5-hc4ft   1/1     Running   0          22s
[root@k8s-master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        5h15m
nginx        NodePort    10.111.130.125   <none>        80:30007/TCP   6m39s


此时svc有80：30007端口映射，用户可以通过IP端口访问
```

![image-20221115153219518](https://note-1308251438.cos.ap-guangzhou.myqcloud.com/typora/202211151532580.png)

```
[root@k8s-master ~]# kubectl delete deployment nginx-deployment		#删除yaml某一部分
deployment.apps "nginx-deployment" deleted
[root@k8s-master ~]# 
[root@k8s-master ~]# kubectl get po
No resources found in default namespace.
[root@k8s-master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP   110m
nginx        ClusterIP   10.111.172.244   <none>        80/TCP    81s


[root@k8s-master ~]# kubectl delete svc nginx
service "nginx" deleted
[root@k8s-master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   111m



展现负载均衡
[root@k8s-master ~]# kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-66b6c48dd5-bc55n   1/1     Running   0          8m21s
nginx-deployment-66b6c48dd5-dzbrq   1/1     Running   0          8m21s
nginx-deployment-66b6c48dd5-l5zkx   1/1     Running   0          8m21s
[root@k8s-master ~]# kubectl exec -it nginx-deployment-66b6c48dd5-bc55n /bin/bash 				#进入pod
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@nginx-deployment-66b6c48dd5-bc55n:/# cd /usr/share/nginx/html
root@nginx-deployment-66b6c48dd5-bc55n:/usr/share/nginx# ls
50x.html  index.html
修改三台机子的首页文件



打开Kubernetes控制台
[root@k8s-master ~]# minikube dashboard
* 正在开启 dashboard ...
  - Using image registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-scraper:v1.0.7
  - Using image registry.cn-hangzhou.aliyuncs.com/google_containers/dashboard:v2.3.1
* 正在验证 dashboard 运行情况 ...
* Launching proxy ...
* 正在验证 proxy 运行状况 ...
http://127.0.0.1:36267/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/

[root@k8s-master ~]# kubectl get ns
NAME                   STATUS   AGE
default                Active   154m
kube-node-lease        Active   154m
kube-public            Active   154m
kube-system            Active   154m
kubernetes-dashboard   Active   2m22s
[root@k8s-master ~]# kubectl get svc -n kubernetes-dashboard
NAME                        TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
dashboard-metrics-scraper   ClusterIP   10.110.160.9   <none>        8000/TCP   3m3s
kubernetes-dashboard        ClusterIP   10.98.255.64   <none>        80/TCP     3m3s		#没有映射，需要修改

[root@k8s-master ~]# kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
改：
spec:
  clusterIP: 10.96.209.166
  clusterIPs:
  - 10.96.209.166
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - port: 80
    protocol: TCP
    targetPort: 9090
  selector:
    k8s-app: kubernetes-dashboard
  sessionAffinity: None
  type: ClusterIP

为：
spec:
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - port: 80
    protocol: TCP
    targetPort: 9090
    nodePort: 30010
  selector:
    k8s-app: kubernetes-dashboard
  sessionAffinity: None
  type: NodePort

[root@k8s-master ~]# kubectl get svc -n kubernetes-dashboard
NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
dashboard-metrics-scraper   ClusterIP   10.111.64.8     <none>        8000/TCP       49m
kubernetes-dashboard        NodePort    10.96.209.166   <none>        80:30010/TCP   49m

浏览器输入：192.168.245.210：30010
```

![image-20221115164455868](https://note-1308251438.cos.ap-guangzhou.myqcloud.com/typora/202211151644962.png)



注：如果在修改时改错了，会生成一个临时文件

```
[root@k8s-master ~]# kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard 
error: services "kubernetes-dashboard" is invalid
A copy of your changes has been stored to "/tmp/kubectl-edit-3021445298.yaml"
error: Edit cancelled, no valid changes were saved.
[root@k8s-master ~]# kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard 
Edit cancelled, no changes made.
[root@k8s-master ~]# vim /tmp/kubectl-edit-3021445298.yaml
[root@k8s-master ~]# kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard 
service/kubernetes-dashboard edited
```

