K8S指令练习
# K8S的指令练习
## 查看所有节点的
```kubernetes
kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 10h v1.17.3
k8s-node1 Ready <none> 9h v1.17.3
k8s-node2 Ready <none> 9h v1.17.3
```
## 创建一个Pod
### 创建一个deployment
```kubernetes
kubectl create deployment [部署名称] --image=[镜像名称]
```
> **如果我们创建一个deployment, 那么会自动创建对应的pod**
### 删除一个deployment
```kubernetes
kubectl delete deployment [部署名称]
```
### 查看当前命名空间pod状态详情
```kubernetes
kubectl get nodes -o wide
```
> **注意, 如果用上面的指令创建一个部署, 最终, 这个部署只会创建一个pod副本, 即最终只会有一个pod**
### 获取所有的信息
```kubernetes
kubectl get all
```
### 模拟Node节点的Docker进程异常结束

> 可以看出, 当docker被关闭时, kubernetes会快速容灾恢复, 重新启动docker
### 模拟Node节点宕机

> 因为默认情况下, 我们维护的pod副本数是1, 当node-1节点宕机的时候, 上面的副本不可用, 整个集群需要维护一个副本, 因此在node-2节点创建一个副本
> **这体现了容灾的快速恢复, 当检测到某个节点的pod不可用时, 在另一个节点重新拉取一个**
> <font color="red">**注意: 这个过程需要5-6分钟**</font>
### 模拟Node节点恢复

> 这个重新被拉起来的Node节点, 发现里面已经被有了之前的容器, 这是因为维护副本总量的原因, node-2已经有了, node-1不需要了
## 暴露Nginx访问
```kubernetes
kubectl expose deployment tomcat6 --port=80 --target-port=8080 --type=NodePort
```

### 具体的映射关系
> **因为service的作用就是对外暴露pod, 因此service的31473端口号映射着pod的80端口号, 而pod的80端口号又映射着docker容器里面的tomcat的8080端口号**
> **因此, 我们访问31473端口号就可以访问容器了**
## 扩容副本
```kubernetes
kubectl scale --replicas=[副本数量] deployment [部署名]
```
> 相当于对这个部署扩容副本(我这里写了副本数=3)


### 缩容副本



## 删除
```kubernetes
kubectl delete [service | deployment | pot] [名称]
```
> **如果我们删除了deployment, 对应的pod也会被自动删除, pod对应的容器也会被自动删除!**
# kubectl文档
[**官方文档**](https://kubernetes.io/zh-cn/docs/reference/kubectl/)
## 测试yaml输出
```kubernetes
kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8 --dry-run=true -o yaml
```
> `--dry-run=true`: 有这个参数, 这个指令只会被执行, 不会被输出, 可以省去我们删除的步骤
> `-o yaml`: 以yaml的形式输出
```yaml
apiVersion: apps/v1 # 版本号
kind: Deployment # 操作的类型
metadata:
creationTimestamp: null # 元数据信息 创建时间戳
labels:
app: tomcat6 # 标签
name: tomcat6 # 部署名
spec: # 具体操作
replicas: 1 # 副本数(这就是为什么默认只有一个副本的原因)
selector:
matchLabels:
app: tomcat6
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: tomcat6
spec:
containers:
- image: tomcat:6.0.53-jre8
name: tomcat
resources: {}
status: {}
```
## 查看pod的yaml信息
```kubernetes
kubectl get pod tomcat6-5f7ccf4cb9-b2d9c -o yaml
```
```yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2023-09-25T01:29:24Z"
generateName: tomcat6-5f7ccf4cb9-
labels:
app: tomcat6
pod-template-hash: 5f7ccf4cb9
name: tomcat6-5f7ccf4cb9-b2d9c
namespace: default
ownerReferences:
- apiVersion: apps/v1
blockOwnerDeletion: true
controller: true
kind: ReplicaSet
name: tomcat6-5f7ccf4cb9
uid: 96445dc7-cf92-4b8d-be7a-ef2e91782dcc
resourceVersion: "26637"
selfLink: /api/v1/namespaces/default/pods/tomcat6-5f7ccf4cb9-b2d9c
uid: cd2aaf2c-4fee-4f70-8696-454842255051
spec:
containers:
- image: tomcat:6.0.53-jre8
imagePullPolicy: IfNotPresent
name: tomcat
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: default-token-clzzt
readOnly: true
dnsPolicy: ClusterFirst
enableServiceLinks: true
nodeName: k8s-node1
priority: 0
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: default
serviceAccountName: default
terminationGracePeriodSeconds: 30
tolerations:
- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists
tolerationSeconds: 300
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
tolerationSeconds: 300
volumes:
- name: default-token-clzzt
secret:
defaultMode: 420
secretName: default-token-clzzt
status:
conditions:
- lastProbeTime: null
lastTransitionTime: "2023-09-25T01:29:24Z"
status: "True"
type: Initialized
- lastProbeTime: null
lastTransitionTime: "2023-09-25T01:29:25Z"
status: "True"
type: Ready
- lastProbeTime: null
lastTransitionTime: "2023-09-25T01:29:25Z"
status: "True"
type: ContainersReady
- lastProbeTime: null
lastTransitionTime: "2023-09-25T01:29:24Z"
status: "True"
type: PodScheduled
containerStatuses:
- containerID: docker://61e638040fdda1098b3d3c3ef9575396a5f0835bbd555645c936ec344569d61b
image: tomcat:6.0.53-jre8
imageID: docker-pullable://tomcat@sha256:8c643303012290f89c6f6852fa133b7c36ea6fbb8eb8b8c9588a432beb24dc5d
lastState: {}
name: tomcat
ready: true
restartCount: 0
started: true
state:
running:
startedAt: "2023-09-25T01:29:25Z"
hostIP: 192.168.10.143
phase: Running
podIP: 10.244.1.5
podIPs:
- ip: 10.244.1.5
qosClass: BestEffort
startTime: "2023-09-25T01:29:24Z"
```
### 通过yaml创建一个具有多个容器的pod
```yaml
apiVersion: v1
kind: Pod
metadata:
labels:
app: pp
name: pp
namespace: default
spec:
containers:
- image: tomcat:6.0.53-jre8
name: tomcat
- image: nginx
name: nginx
```
## 以Yaml的形式部署
```kubernetes
kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre -o yml > kube-pod-yml
```
### 同时部署多个Pods
```yaml
apiVersion: v1
kind: Pod
metadata:
labels:
app: p1
name: p1
namespace: default
spec:
containers:
- image: tomcat:6.0.53-jre8
name: tomcat
---
apiVersion: v1
kind: Pod
metadata:
labels:
app: p2
name: p2
namespace: default
spec:
containers:
- image: tomcat:6.0.53-jre8
name: tomcat
```
```kubernetes
kubectl expose deployment [部署名] --port=? --target-port=? --type=NodePort
```
> **注意`---`可以区分多个代码片段, 这个相当于Java中的分号**
## 部署ingress
```yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: web
spec:
rules:
- host: tomcat6.atguigu.com
http:
paths:
- backend:
serviceName: tomcat6
servicePort: 80
```
> 上面这串东西的意思是, 创建一个ingress, 里面的路由规则是, 如果遇到域名
`tomcat6.atguigu.com`, 则路由到service名字叫tomcat6的service上, 对应的service端口号是80, 然后对卡里面的pods负载均衡