在 K8s 中,创建一个 Pod 有两种主流方式:
kubectl run webserver --image=registry.access.redhat.com/ubi8/httpd-24:1-161
上面的命令就是基于指定的 image,创建一个名为 webserver 的 pod。运行过后,用 kubectl get pods
能够看到当前 namespace 下的所有 pod 的信息
kubectl apply -f xxx.yml
上面的命令就是根据 xxx.yml 来创建一个 pod。当然如果不清楚 K8s yaml 配置的格式,可以运行:
kubectl run probes --image=quay.io/redhattraining/do100-probes:latest --dry-run=client -o yaml
它会在终端输出一个 yaml 配置文件的模板
Kubernetes 最显著的特性之一,就是它支持开发者采用声明式方法进行自动的容器生命周期管理。声明式方法意味着开发者只需声明什么应用的目标状态,Kubernetes 便会负责更新容器以达成该状态。
针对应用的目标状态,最基础的几个信息是:
为了实现提到的自动容器生命周期管理,K8s 具备以下特性
最基础的,创建一个 Deployment 的命令是:
kubectl create deployment do100-versioned-hello --image quay.io/redhattraining/do100-versioned-hello:v1.0
命令基于指定的镜像,创建了一个名为 do100-versioned-hello
的 Deployment,它只有一个 Pod。想查看 deployment 的具体信息,可以用:
# 基础查看信息的命令
kubectl describe deployment do100-versioned-hello
# 以 yaml 配置文件的格式查看信息
kubectl describe deployment do100-versioned-hello -o yaml
目前只有一个 Pod,可以用下面的命令来快速调整,命令将 Pod 的期望个数调整为 2,K8s 会自动创建 Pod 以符合期望,这就是自动扩缩容特性。
kubectl scale deployment do100-versioned-hello --replicas=2
同时也可以使用 edit 命令,直接编辑配置文件来修改配置
kubectl edit deployment do100-versioned-hello
当创建 Pod 时,它们会被分配一个 IP 地址。你可以使用这个 IP 地址从 Kubernetes 集群内的任何地方访问 Pod。Pod 内的容器共享同一网络空间,这意味着,在 Pod 内部,容器之间可以通过使用localhost
地址进行通信。
服务是一种抽象概念,它定义了对一组 Pod 的访问。通过使用服务,您不是直接通过 Pod 的私有 IP 地址访问它们。相反,服务会根据某些标准(例如标签)定位多个 Pod,并将任何请求转发给其中一个符合该标准的 Pod。服务使你能够将具有逻辑关系的 pod 分组,并允许你以可靠的方式访问它们。同时,它在其所针对的 pod 之间实现了负载均衡机制。
![Pasted image 20240926162202.png]
ClusterIP
ClusterIP
是一种 Service
类型。默认情况下,服务会被分配一个集群内部的 IP 地址,该 IP 仅在集群内部有效。这种类型的服务称为 ClusterIP
。这意味着在集群中部署的 Pod 可以通过使用 ClusterIP 向服务发出请求
如果想对外暴露服务,可以使用其他类型的 Service,如 NodePort
或 LoadBalancer
或者 Ingress
创建 Service
创建 Service 简单的方法是直接执行下面的命令,命令为名为 name-generator 的 deployment 创建一个 Service,将外部 80 端口的请求转发到内部的 8080 端口上,同时指定
kubectl expose deployment name-generator --port=80 --target-port=8080 --name=name-generator-service
或者可以用 manifest 文件配置。以下示例创建了一个名为 nginx-service
的服务,并针对带有标签 app: nginx
的任何 Pod。该服务监听 8080 端口的请求,并将它们转发到 Pod 内部的 3000 端口。由于清单中未包含 type
字段,因此将创建一个类型为 ClusterIP
的服务。
apiVersion: v1
kind: Service
metadata:
name: nginx-service (1)
spec:
selector: (2)
app: nginx
ports: (3)
- protocol: TCP
port: 8081 (4)
targetPort: 3000 (5)
更进一步
服务将应用与所用 Pod 的实际位置隔离开来,但你仍需知道 Service 的 IP 才能从应用中使用它。直接使用 IP 地址并非良策,因为未来一旦 IP 变更, 必须手动更新维护。为避免此情形,K8s 提供了两种发现服务的方式:
service.namespace.svc.cluster.local
K8s 创建临时终端 Pod
实际情况中,我们可能需要一个位于指定命名空间的终端,在终端发起请求来测试服务。下面的命令在指定的 namespace 中创建一个 Pod 并创建一个与之交互的远程 shell 会话,在退出后 Pod 会被终止
kubectl run -n ubuntu-stage curl -it --rm --image=registry.access.redhat.com/ubi8/ubi-minimal -- sh
资源请求(Resource Requests)和资源限制(Resource Limits) 是 Kubernetes 中用于管理和控制 Pod 资源使用的两种机制。request 是最少申请的资源量,limit 是资源使用上限值
资源配额(Resource Quota) 是用于限制命名空间(Namespace)中资源使用的机制。通过定义资源配额,可以控制命名空间中所有 Pod 总共可以使用的资源量
在配置文件配置资源限制:CPU 的 m 是指 1/1000 CPU 利用率
spec:
replicas: 1
selector:
matchLabels:
app: hello-limit
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: hello-limit
spec:
containers:
- image: quay.io/redhattraining/hello-world-nginx:v1.0
name: hello-world-nginx
resources:
requests:
cpu: "1200m"
memory: 20Mi
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。