本地单机架构minikube
https://developer.aliyun.com/article/221687?spm=a2c6h.14164896.0.0.77987bd58zJvgm
kubectl版本要高于k8s版本
1.安装kubectl
下载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下载
[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下载
指定版本需要将链接的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命令使用
[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
修改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端口访问
[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
注:如果在修改时改错了,会生成一个临时文件
[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
it 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