1、创建一个k8s资源的时候可以使用 kubectl create 也可以使用 kubectl apply?
-
kubectl create命令可创建新资源。 因此,如果再次运行该命令,则会抛出错误,因为资源名称在名称空间中应该是唯一的。
-
kubectl apply命令将配置应用于资源。 如果资源不在那里,那么它将被创建。 kubectl apply命令可以第二次运行,因为它只是应用如下所示的配置。 在这种情况下,配置没有改变。 所以,pod没有改变。
在kubectl create和kubectl apply之间第一次创建资源时没有区别。 但是,第二次kubectl create会抛出错误。简单来说,如果在单个文件上运行操作以创建资源,则create和apply基本相同。 但是, apply允许您在目录下的多个文件上同时创建和修补。
2、如果直接删除pod触发了replicas的确保机制,需删除deployment。
#kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-app 1/1 1 1 24h
#kubectl delete deployment nginx-app
3、 停止镜像 kindest/node v1.20.2 (浏览器不可以访问)
( kubectl create deployment nginx-ubuntu --image=nginx -o yaml --dry-run > nginx-kind.yaml)
# kubectl create -f nginx- kind.yaml
The connection to the server 127.0.0.1:36275 was refused - did you specify the right host or port?
*——>启动镜像kindest/node v1.20.2后(说明 Ubuntu 20.04.2 LTS中执行kubectl命令使用的是kind集群)
# kubectl create -f nginx-kind.yaml
deployment.apps/nginx-ubuntu created
然后启动服务
( kubectl expose deployment nginx- ubuntu --port=80 --target-port=8080 --type=NodePort -o yaml --dry-run=client > nginx-kind-svc.yaml)
# kubectl create -f nginx-kind-svc.yaml
service/nginx-ubuntu created
root@ATC-Analyzer:~# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-ubuntu NodePort 10.96.79.189
*:但是在浏览器中:localhost:8080 或 http://168.192.11.210: 32502 / 均 无法访问。
说明 kubectl 使用的是kind集群(PORT:36275),而不是docker desktop中集成的Kubernetes集群,因为使用 kind集群,启动的容器APP在 docker desktop中也看不见,只能通过命令查看:kubectl get pod,svc,deployment
kubectl命令怎么转换到使用 Kubernetes集群?
-
在Windows PowerShell中执行kubectl命令使用的是 docker desktop中集成的Kubernetes集群, 启动的容器APP在docker desktop中也能看见;
-
在Ubuntu 20.04.2 LTS中执行kubectl命令使用的是 kind集群,启动的容器APP在docker desktop中看不见;
-
以上是对k8s( kubectl)而言,docker命令创建容器在 Windows PowerShell和 Ubuntu 20.04.2之间互相都能看见。
4、步骤3在 Windows PowerShell(含按windows键输入bash打开的MINGW64:/c/Users/mi_zy) 中操作:(浏览器可以访问)
(kubectl create deployment nginx-win10 --image=nginx -o yaml --dry-run > nginx-win10.yaml)
# kubectl create -f nginx-win10.yaml
deployment.apps/nginx-win10 created
( kubectl expose deployment nginx- win10 --port=6000 --target-port=80 --type=NodePort -o yaml --dry-run=client >nginx-win10-svc.yaml)
# kubectl create -f nginx-win10-svc.yaml
service/nginx-win10 created
启动的容器APP在 docker desktop中也能看见:
*:但是在浏览器中无法访问:localhost:6000(win10主机端口需是 : 32153)
--target-port='': 是容器内部的端口即 Container Port,Name or number for the port on the container that the service should direct traffic to.Optional.
--port='': The port that the service should serve on. Copied from the resource being exposed, if unspecified
PS C:\Users\atc> kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-win10 NodePort 10.104.249.27 168.192.11.210 6000: 32153/TCP 3m48s
然后http://168.192.11.210: 32153/ 可以访问(含127.0.0.1:32153)!(即使没有参数 --external-ip=168.192.11.210也可以),说明使用win10的 Kubernetes集群,参数 --port=6000外还有一层转换( 6000: 32153),即80(Pod)-->6000(Node:docker-desktop/OS-IMAGE:Docker Desktop"/KERNEL-VERSION:"5.4.72-microsoft-standard- WSL2")-->32153(Win10对外暴露端口)
> kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
docker-desktop Ready master 25h v1.19.3
192.168.65.3
- service的clusterip可以使用,使用方式serviceClusterIP:port(其他方式都不行),所有的节点都可以通过访问serviceClusterIP:port进行访问服务
- pod的clusterip进行访问,使用方式podClusterIP:targetport,但是每个节点只能使用自己节点的podClusterIP访问自己的pod
- node的ip进行访问,使用方式nodeIP:nodePort(如果nodePort没有指定,创建service会自动生成一个)
5、切换命名空间:
$ kubectl config set-context docker-desktop --namespace=zabbix
Context "docker-desktop" modified.$ kubectl get pods,deployment,replicaset
NAME READY STATUS RESTARTS AGE
pod/mysql-server-rwk84 0/1 Pending 0 3h57m
pod/zabbix-agent-v5zkd 1/1 Running 1 3h57m
pod/zabbix-java-gateway-47wwj 1/1 Running 1 3h57m
pod/zabbix-proxy-mysql-jbgmm 1/1 Running 1 3h57m
pod/zabbix-proxy-sqlite3-q42ph 1/1 Running 1 3h57m
pod/zabbix-server-qc744 1/2 Running 9 3h57m
pod/zabbix-web-8hscw 0/1 CrashLoopBackOff 12 3h57m
pod/zabbix-web-d48hk 0/1 CrashLoopBackOff 7 3h57m
6、基于YAML文件创建部署
$ kubectl create -f kubernetes.yaml
namespace/zabbix created
service/zabbix-web created
......
7、查看状态
$ kubectl get pods,deployment,replicaset
NAME READY STATUS RESTARTS AGE
pod/mysql-server-7rcbb 0/1 Pending 0 107s
pod/zabbix-agent-8w4nh 1/1 Running 0 107s
8、使用其YAML配置文件删除Kubernetes部署 https://www.cnblogs.com/a5idc/p/13703692.html
$ kubectl delete -f kubernetes.yaml
namespace "zabbix" deleted
service "zabbix-web" deleted
......
9、将 zabbix-web默认ClusterIP修改为type: NodePort
$ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
zabbix-web NodePort 10.97.231.16 192.168.31.165 80: 30309/TCP,443:32219/TCP 6m13s
打开浏览器:http://192.168.31.165:
30309/
当前无法使用此页面
192.168.31.165 未发送任何数据。
有可能是 pod/mysql-server状态为 Pending导致,待查。