一、k8s中的资源
1、资源介绍




root@k8s-master \~\]# kubectl --namespace timinglee get po No resources found in timinglee namespace. \[root@k8s-master \~\]# kubectl run testpod --image timinglee/nginx \[root@k8s-master \~\]# kubectl get pods -w NAME READY STATUS RESTARTS AGE testpod 0/1 ContainerCreating 0 19s \[root@k8s-master \~\]# kubectl delete pods testpod --force
2、资源管理方式

2.1 命令式对象管理

2.2 资源类型
k8s中所有的内容都抽象为资源
kubectl api-resources
常用资源类型

kubect常见命令操作

2.3 基本命令示例


root@k8s-master \~\]# kubectl get deployments.apps lee
NAME READY UP-TO-DATE AVAILABLE AGE
lee 2/2 2 2 7m10s
\[root@k8s-master \~\]# kubectl edit deployments.apps lee
deployment.apps/lee edited

> \[root@k8s-master \~\]# kubectl get deployments.apps lee
>
> NAME READY UP-TO-DATE AVAILABLE AGE
>
> lee 4/4 4 4 8m44s
>
> #####打补丁
>
> \[root@k8s-master \~\]# kubectl patch deployments.apps lee -p '{"spec":{"replicas":2}}'
>
> deployment.apps/lee patched
>
> \[root@k8s-master \~\]# kubectl get deployments.apps lee
>
> NAME READY UP-TO-DATE AVAILABLE AGE
>
> lee 2/2 2 2 11m
>
> \[root@k8s-master \~\]# kubectl delete deployments.apps lee
>
> deployment.apps "lee" deleted
>
> \[root@k8s-master \~\]# kubectl get pods
>
> NAME READY STATUS RESTARTS AGE
>
> myapp1 1/1 Running 1 (16m ago) 18m
### 3、运行和调试命令
#### 运行pod
**\[root@k8s-master \~\]# kubectl run testpod --image nginx**
pod/testpod created
\[root@k8s-master \~\]# kubectl get pods
NAME READY STATUS RESTARTS AGE
testpod 1/1 Running 0 5s
\[root@k8s-master \~\]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
testpod 1/1 Running 0 44s 10.244.1.3 k8s-node2.timinglee.org \
d51af96cf93e: Layer already exists
latest: digest: sha256:28e01ab32c9dbcbaae96cf0d5b472f22e231d9e603811857b295e61197e40a9b size: 527
###ctrl+pq退出不停止pod

运行非交互pod
root@k8s-master \~\]# kubectl run nginx --image nginx
pod/nginx created
#### ##进入已经运行的容器,且容器有交互环境

#### ###在已经运行的pod中运行指定命令
#### ###日志文件到pod中
#### 复制pod文件到本机
\[root@k8s-master \~\]# kubectl cp nginx:/boot/ anaconda-ks.cfg
tar: Removing leading \`/' from member names
### 4、高级命令示例

\[root@k8s-master \~\]# vim testpod1.yml


> \[root@k8s-master \~\]# docker tag timinglee/myapp:v1 reg.timinglee.org/library/myapp:v1
>
> \[root@k8s-master \~\]# docker tag timinglee/myapp:v2 reg.timinglee.org/library/myapp:v2
>
> \[root@k8s-master \~\]# docker tag busyboxplus:latest reg.timinglee.org/library/busyboxplus:latest
>
> \[root@k8s-master \~\]# docker push reg.timinglee.org/library/myapp:v1
>
> \[root@k8s-master \~\]# docker push reg.timinglee.org/library/myapp:v2
>
> \[root@k8s-master \~\]# docker push reg.timinglee.org/library/busyboxplus:latest
\[root@k8s-master \~\]# kubectl get pods
No resources found in default namespace.
\[root@k8s-master \~\]# kubectl run testpod1 --image nginx --dry-run=client -o yaml \> testpod1.yml
\[root@k8s-master \~\]# vim testpod1.yml

\[root@k8s-master \~\]# kubectl create -f testpod1.yml
pod/myapp1 created
\[root@k8s-master \~\]# vim testpod1.yml

\[root@k8s-master \~\]# kubectl create -f testpod1.yml
Error from server (AlreadyExists): error when creating "testpod1.yml": pods "myapp1" already exists

#### **##################################**
\[root@k8s-master \~\]# kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp1 1/1 Running 1 (16m ago) 18m
\[root@k8s-master \~\]# kubectl delete pods myapp1
pod "myapp1" deleted
\[root@k8s-master \~\]# kubectl get pods
No resources found in default namespace.
#### 
####生成控制器
\[root@k8s-master \~\]# kubectl create deployment lee --image myapp:v1 --dry-run=client -o yaml \> deployment.yml
\[root@k8s-master \~\]# vim deployment.yml

\[root@k8s-master \~\]# vim deployment.yml

\[root@k8s-master \~\]# kubectl apply -f deployment.yml
deployment.apps/lee created
\[root@k8s-master \~\]# kubectl get deployments.apps lee
NAME READY UP-TO-DATE AVAILABLE AGE
lee 2/2 2 2 12s
查看详细信息

#### 删除
\[root@k8s-master \~\]# kubectl delete -f deployment.yml
deployment.apps "lee" deleted
\[root@k8s-master \~\]# kubectl get deployments.apps
No resources found in default namespace.
### 资源标签
\[root@k8s-master \~\]# kubectl apply -f deployment.yml
deployment.apps/lee created
\[root@k8s-master \~\]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
lee-579c757b65-8lvlh 1/1 Running 0 20s app=lee,pod-template-hash=579c757b65
lee-579c757b65-ptmkt 1/1 Running 0 20s app=lee,pod-template-hash=579c757b65
\[root@k8s-master \~\]# watch -n 1 kubectl get pods --show-labels




## 二、什么是pod
* Pod是可以创建和管理Kubernetes计算的最小可部署单元
* 一个Pod代表着集群中运行的一个进程,每个pod都有一个唯一的ip
* 一个pod类似一个豌豆荚,包含一个或多个容器(通常是docker)
* 多个容器间共享IPC、Network和UTC namespace
### 1、创建自主式pod (生产不推荐)
#### 优点:
**灵活性高:**
* 可以精确控制 Pod 的各种配置参数,包括容器的镜像、资源限制、环境变量、命令和参数等,满足特定的应用需求。
**学习和调试方便:**
* 对于学习 Kubernetes 的原理和机制非常有帮助,通过手动创建 Pod 可以深入了解 Pod 的结构和配置方式。在调试问题时,可以更直接地观察和调整Pod的设置。
**适用于特殊场景:**
* 在一些特殊情况下,如进行一次性任务、快速验证概念或在资源受限的环境中进行特定配置时,手动创建 Pod 可能是一种有效的方式
#### 缺点:
**管理复杂:**
* 如果需要管理大量的 Pod,手动创建和维护会变得非常繁琐和耗时。难以实现自动化的扩缩容、故障恢复等操作。
**缺乏高级功能:**
* 无法自动享受 Kubernetes 提供的高级功能,如自动部署、滚动更新、服务发现等。这可能导致应用的部署和管理效率低下。
**可维护性差:**
* 手动创建的 Pod 在更新应用版本或修改配置时需要手动干预,容易出现错误,并且难以保证一致性。相比之下,通过声明式配置或使用 Kubernetes 的部署工具可以更方便地进行应用的维护和更新。

### 2、利用控制器管理pod (推荐)
#### 高可用性和可靠性:
* 自动故障恢复:如果一个Pod 失败或被删除,控制器会自动创建新的 Pod 来维持期望的副本数量。确保应用始终处于可用状态,减少因单个Pod故障导致的服务中断。
* 健康检查和自愈;可以配置控制器对 Pod 进行健康检查(如存活探针和就绪探针)。如果 Pod 不健康,控制器会采取适当的行动,如重启Pod 或删除并重新创建它,以保证应用的正常运行。
#### 可扩展性:
* 轻松扩缩容:可以通过简单的命令或配置更改来增加或减少 Pod 的数量,以满足不同的工作负载需求。例如,在高流量期间可以快速扩展以处理更多请求,在低流量期间可以缩容以节省资源。
* 水平自动扩缩容(HPA):可以基于自定义指标(如CPU利用率、内存使用情况或应用特定的指标)自动调整Pod的数量,实现动态的资源分配和成本优化,
#### 版本管理和更新:
* 滚动更新:对于 Deployment 等控制器,可以执行滚动更新来逐步替换旧版本的 Pod 为新版本确保应用在更新过程中始终保持可用。可以控制更新的速率和策略,以减少对用户的影响。
* 回滚:如果更新出现问题,可以轻松回滚到上一个稳定版本,保证应用的稳定性和可靠性
#### 声明式配置:
* 简洁的配置方式:使用YAML 或JSON格式的声明式配置文件来定义应用的部署需求。这种方式使得配置易于理解、维护和版本控制,同时也方便团队协作。
* 期望状态管理;只需要定义应用的期望状态(如副本数量、容器镜像等),控制器会自动调整实际状态与期望状态保持一致。无需手动管理每个Pod的创建和删除,提高了管理效率。
#### 服务发现和负载均衡:
* 自动注册和发现:Kubernetes中的服务(Service)可以自动发现由控制器管理的Pod,并将流量路由到它们。这使得应用的服务发现和负载均衡变得简单和可靠,无需手动配置负载均衡器
* 流量分发:可以根据不同的策略(如轮询、随机等)将请求分发到不同的Pod,提高应用的性能和可用性。
#### 多环境一致性:
* 一致的部署方式:在不同的环境(如开发、测试、生产)中,可以使用相同的控制器和配置来部署应用,确保应用在不同环境中的行为一致。这有助于减少部署差异和错误,提高开发和运维效率。

### 实验
\[root@k8s-master \~\]# vim testpod1.yml


\[root@k8s-master \~\]# kubectl logs pods/myapp1 web2
####web2的80端口被web1占用
\[root@k8s-master \~\]# kubectl delete -f testpod1.yml
pod "myapp1" deleted
\[root@k8s-master \~\]# vim testpod1.yml


\[root@k8s-master \~\]# kubectl delete -f testpod1.yml
pod "myapp1" deleted



#### 自动注册和发现
\[root@k8s-master \~\]# vim deployment.yml

\[root@k8s-master \~\]# kubectl apply -f deployment.yml
deployment.apps/lee created
\[root@k8s-master \~\]# kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
lee 2/2 2 2 16s



> 扩容
>
> \[root@k8s-master \~\]# kubectl scale deployment lee --replicas 4
>
> deployment.apps/lee scaled
>
> \[root@k8s-master \~\]# kubectl get deployments.apps
>
> NAME READY UP-TO-DATE AVAILABLE AGE
>
> lee 4/4 4 4 11m
>
> \[root@k8s-master \~\]# curl 10.99.148.75/hostname.html
>
> lee-579c757b65-jpb6g
>
> \[root@k8s-master \~\]# curl 10.99.148.75/hostname.html
>
> lee-579c757b65-hstck
>
> \[root@k8s-master \~\]# curl 10.99.148.75/hostname.html
>
> lee-579c757b65-j98ss
>
> \[root@k8s-master \~\]# curl 10.99.148.75/hostname.html
>
> lee-579c757b65-jpb6g
>
> \[root@k8s-master \~\]# curl 10.99.148.75/hostname.html
>
> lee-579c757b65-hstck
>
> \[root@k8s-master \~\]# curl 10.99.148.75/hostname.html
>
> lee-579c757b65-5mp22
>
> \[root@k8s-master \~\]# curl 10.99.148.75/hostname.html
>
> lee-579c757b65-5mp22
> 
>
> \[root@k8s-master \~\]# kubectl delete service lee
>
> service "lee" deleted
>
> \[root@k8s-master \~\]# kubectl delete -f deployment.yml
>
> deployment.apps "lee" deleted
> 建立pod
>
>  
>
> 
### 3、k8s中pod更新及回滚


\[root@k8s-master \~\]# curl 10.244.1.19
Hello MyApp \| Version: v1 \| \Pod Name\

#### 更新版本
\[root@k8s-master \~\]# kubectl rollout history deployment timinglee
deployment.apps/timinglee
REVISION CHANGE-CAUSE
1 \