K8S资源配置清单1

2022-01-26  本文已影响0人  强出头
image image image image

<pre data-language="plain" id="88a19dad" class="ne-codeblock language-plain" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959">#使用陈述式对象配置

创建一个名称空间

~]# kubectl create -f develop-n.yaml
namespace/develop created
~]# cat develop-n.yaml
apiVersion: v1
kind: Namespace
metadata:
name: develop

使用声明式对象配置

创建一个名称空间

~]# kubectl delete ns develop
namespace "develop" deleted
~]# kubectl apply -f develop-n.yaml
namespace/develop created
~]# cat develop-n.yaml
apiVersion: v1
kind: Namespace
metadata:
name: develop

声明式可以更改配置文件后直接重新执行

~]# cat develop-n.yaml
apiVersion: v1
kind: Namespace
metadata:
name: test
~]# kubectl get ns
NAME STATUS AGE
default Active 13h
develop Active 112s
kube-node-lease Active 13h
kube-public Active 13h
kube-system Active 13h
~]# kubectl apply -f develop-n.yaml
namespace/test created
~]# kubectl get ns
NAME STATUS AGE
default Active 13h
develop Active 118s
kube-node-lease Active 13h
kube-public Active 13h
kube-system Active 13h
test Active 2s</pre>

pod yaml官方写法

https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.16/#pod-v1-core

<pre data-language="plain" id="32fa4b62" class="ne-codeblock language-plain" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959">#可以查看启动的pod作为模板
~]# kubectl get pods ngx-dep-d554574bd-fq6kq -o yaml --export
Flag --export has been deprecated, This flag is deprecated and will be removed in future.
apiVersion: v1 #api版本一般不变
kind: Pod #类型为Pod
metadata: #标准对象的元数据。
creationTimestamp: null #CreationTimestamp是表示创建此对象时服务器时间的时间戳。不能保证在单独的操作中按事前发生的顺序进行设置。客户可能未设置此值。它以RFC3339形式表示且采用UTC。由系统填充。
generateName: ngx-dep-d554574bd- #仅当未提供“名称”字段时,GenerateName是服务器使用的可选前缀,用于生成唯一名称。如果使用此字段,则返回给客户端的名称将与传递的名称不同。该值还将与一个唯一的后缀结合在一起。提供的值具有与“名称”字段相同的验证规则,并且可能会被截短以使该值在服务器上唯一所需的后缀长度。如果指定了此字段并且生成的名称存在,则服务器将不会返回409-而是将返回201 Created或500,且Reason ServerTimeout指示在分配的时间内找不到唯一名称,客户端应重试。
labels: #字符串键和值的映射,可用于组织和分类(范围和选择)对象。可以匹配复制控制器和Service的选择器。
app: ngx-dep
pod-template-hash: d554574bd
ownerReferences: #该对象所依赖的对象列表。 如果已删除列表中的所有对象,则将垃圾回收该对象。 如果此对象由控制器管理,则此列表中的条目将指向该控制器,并且控制器字段设置为true。 最多只能有一个管理控制器。

示例

<pre data-language="plain" id="314bd789" class="ne-codeblock language-plain" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959">~]# cat pod-demo.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
name: pod-demo
namespace: develop
spec:
containers:

~]# kubectl get pods -n develop
NAME READY STATUS RESTARTS AGE
pod-demo 1/1 Running 0 89s

~]# cat pod-demo-2.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
namespace: default
spec:
containers:

查看Pod中的定义

~]# kubectl explain Pods.spec

进入Pod中的容器

~]# kubectl exec -it pod-demo -c nginx -n prod -- sh

查看Pod中容器日志

~]# kubectl logs pod-demo -c myapp -n prod
10.244.0.0 - - [05/Oct/2019:08:15:16 +0000] "GET / HTTP/1.1" 200 65 "-" "curl/7.29.0" "-"
10.244.0.0 - - [05/Oct/2019:08:15:31 +0000] "GET /hostname.html HTTP/1.1" 200 9 "-" "curl/7.29.0" "-"

hostNetwork: true #表示共享宿主机名称空间,一般使用Port映射</pre>

管理Pod对象的容器

标签(Label)

image

标签选择器(Label Slector)

定义标签选择器的方式

<pre data-language="plain" id="bab7e13d" class="ne-codeblock language-plain" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959"># 创建时指定标签
~]# cat pod-demo-1.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: prod
labels:
app: pod-demo
rel: stable
spec:
containers:

使用label命令来添加标签

~]# kubectl label pods pod-demo -n prod tier=frontend
pod/pod-demo labeled
~]# kubectl get pods -n prod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-demo 2/2 Running 0 4m23s app=pod-demo,rel=stable,tier=frontend
basic]# kubectl get pods -n prod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-demo 2/2 Running 0 4m23s app=pod-demo,rel=stable,tier=frontend

使用label命令来重写标签

~]# kubectl label --overwrite pods pod-demo -n prod tier=test
pod/pod-demo labeled
~]# kubectl get pods -n prod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-demo 2/2 Running 0 5m47s app=pod-demo,rel=stable,tier=test

使用label命令来删除标签

~]# kubectl label pods pod-demo -n prod tier-
pod/pod-demo labeled
~]# kubectl get pods -n prod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-demo 2/2 Running 0 7m18s app=pod-demo,rel=stable

使用Kubectl -l 过滤标签

~]# kubectl get pods --show-labels -l app=myapp
NAME READY STATUS RESTARTS AGE LABELS
myapp-5c6976696c-7p7dp 1/1 Running 0 8d app=myapp,pod-template-hash=5c6976696c
myapp-5c6976696c-czp6d 1/1 Running 0 8d app=myapp,pod-template-hash=5c6976696c
myapp-5c6976696c-rr5v4 1/1 Running 0 8d app=myapp,pod-template-hash=5c6976696c
~]# kubectl get pods --show-labels -l app!=myapp
NAME READY STATUS RESTARTS AGE LABELS
mypod 1/1 Running 0 3d5h <none>
ngx-dep-d554574bd-fq6kq 1/1 Running 0 8d app=ngx-dep,pod-template-hash=d554574bd
~]# kubectl get pods --show-labels -l "app in (myapp,ngx-dep)"
NAME READY STATUS RESTARTS AGE LABELS
myapp-5c6976696c-7p7dp 1/1 Running 0 8d app=myapp,pod-template-hash=5c6976696c
myapp-5c6976696c-czp6d 1/1 Running 0 8d app=myapp,pod-template-hash=5c6976696c
myapp-5c6976696c-rr5v4 1/1 Running 0 8d app=myapp,pod-template-hash=5c6976696c
ngx-dep-d554574bd-fq6kq 1/1 Running 0 8d app=ngx-dep,pod-template-hash=d554574bd
~]# kubectl get pods --show-labels -l "app notin (ngx-dep)"
NAME READY STATUS RESTARTS AGE LABELS
myapp-5c6976696c-7p7dp 1/1 Running 0 8d app=myapp,pod-template-hash=5c6976696c
myapp-5c6976696c-czp6d 1/1 Running 0 8d app=myapp,pod-template-hash=5c6976696c
myapp-5c6976696c-rr5v4 1/1 Running 0 8d app=myapp,pod-template-hash=5c6976696c
mypod 1/1 Running 0 3d5h <none>
~]# kubectl get pods --show-labels -l '!app'
NAME READY STATUS RESTARTS AGE LABELS
mypod 1/1 Running 0 3d5h <none>
~]# kubectl get pods --show-labels -l 'app'
NAME READY STATUS RESTARTS AGE LABELS
myapp-5c6976696c-7p7dp 1/1 Running 0 8d app=myapp,pod-template-hash=5c6976696c
myapp-5c6976696c-czp6d 1/1 Running 0 8d app=myapp,pod-template-hash=5c6976696c
myapp-5c6976696c-rr5v4 1/1 Running 0 8d app=myapp,pod-template-hash=5c6976696c
ngx-dep-d554574bd-fq6kq 1/1 Running 0 8d app=ngx-dep,pod-template-hash=d554574bd</pre>

资源注解(annotation)

<pre data-language="plain" id="2d7865e9" class="ne-codeblock language-plain" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959"># 添加及查看注解,apply就是通过比较注解来添加新的资源
~]# cat pod-demo-1.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: prod
labels:
app: pod-demo
rel: stable
annotations:
ik8s.io/project: test-info
spec:
containers:

Pod的生命周期

livenessProbe(健康状态监测可以重启容器)

readinessProbe(就绪状态监测不可以重启容器)

<pre data-language="plain" id="51dc924a" class="ne-codeblock language-plain" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959"># lifecycle具体使用查看使用方法
~]# kubectl explain pods.spec.containers.lifecycle

hook的使用示例

apiVersion: v1
kind: Pod
metadata:
name: lifecycle-demo
spec:
containers:

<pre data-language="plain" id="ceb73371" class="ne-codeblock language-plain" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959"># livenessProbe健康状态监测具体使用查看使用方法
~]# kubectl explain pods.spec.containers.livenessProbe

livenessProbe使用示例

apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-http
spec:
containers:

<pre data-language="plain" id="bcf59432" class="ne-codeblock language-plain" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959"># readinessProbe就绪状态监测具体使用查看使用方法
~]# kubectl explain pods.spec.containers.readinessProbe

readinessProbe示例

apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-http
spec:
containers:

主要体现在READY状态上,就绪监测同样为周期监测。只要为0就不会被service所引用。

~]# kubectl get pods -w
NAME READY STATUS RESTARTS AGE
myapp-5c6976696c-7p7dp 0/1 Running 0 9d</pre>

Pod对象的相位

Pod对象的创建过程

image

容1

Pod的终止过程

image

Pod Security安全

<pre data-language="plain" id="f03c6481" class="ne-codeblock language-plain" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959">apiVersion: v1
kind: Pod
metadata:
name: security-context-demo
spec:
securityContext:
runAsUser: 1000
runAsGroup: 3000
fsGroup: 2000
volumes:

在配置文件中,该runAsUser字段指定对于Pod中的任何容器,所有进程都以用户ID 1000运行。

该runAsGroup字段为Pod中的任何容器中的所有进程指定主组ID 3000。如果省略此字段,则容器的主要组ID将为root(0)。

runAsGroup指定时,用户1000和组3000也将拥有所有创建的文件。由于fsGroup指定了字段,因此容器的所有进程也是补充组ID 2000的一部分。

卷的所有者/data/demo和在该卷中创建的任何文件都将是组ID 2000。</pre>

资源需求及资源限制

<pre data-language="plain" id="be3a36f2" class="ne-codeblock language-plain" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959">#以下 Pod 有两个容器。每个容器的请求为 0.25 cpu 和 64MiB(226 字节)内存,每个容器的限制为 0.5 cpu 和 128MiB 内存。

你可以认为该 Pod 请求 0.5 cpu 和 128 MiB 的内存,限制为 1 cpu 和 256MiB 的内存。

requests:下限,不满足则不启动。limits:上限

apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers:

Pod服务质量类别

<pre data-language="plain" id="039e6e76" class="ne-codeblock language-plain" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959">#在Qos中显示
~]# kubectl describe pods mypod
...
QoS Class: BestEffort
Node-Selectors: <none>
...</pre>

Pod Controller

Pod就是一种资源,资源代表一种类型

创建出来的具体的Pod就是对象,对象代表一种实力


image
image

kube-controller-manager

kube-controller-manager

<pre data-language="plain" id="5ec7e5f0" class="ne-codeblock language-plain" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959">#更改kube-controller-manager的yaml位置,更改后k8s会自动识别并重新启动kube-controller-manager
/etc/kubernetes/manifests/kube-controller-manager.yaml</pre>

Pod Controllers

ReplicaSet

<pre data-language="plain" id="t20sr" class="ne-codeblock language-plain" style="border: 1px solid #e8e8e8; border-radius: 2px; background: #f9f9f9; padding: 16px; font-size: 13px; color: #595959">kubectl explain rs
kubectl api-versions

matchLabels 和 template 的 labels 必须匹配

标签选择器一旦选中,必须删除控制器才能更改

root@k8s-master:/data/k8s-learn# cat rs-example.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: myapp-rs
namespace: prod
spec:
replicas: 2
selector:
matchLabels:
app: myapp-pod
template:
metadata:
labels:
app: myapp-pod
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80

通过修改pod的标签也会对副本数量产生影响,只认标签

kubectl label --overwrite pod myapp-rs-p92pg -n prod app=test

查看标签

kubectl get pods -n prod --show-labels

主要使用 Deployment ,Deployment 会自动创建 ReplicaSet 且名称最后带模板哈希

maxSurge为最多允许多出的pod数量,maxUnavailable为最多不可用pod数量

比如当前副本集为4,对多可多出1,先加1个,当前副本集为5,最多不可用为1(这里是以加上maxSurge后的副本数5为基准)

所以这里是加1,减1,加1,减1

root@k8s-master:/data/k8s-learn# cat de-example.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
namespace: prod
spec:
replicas: 4
minReadySeconds: 10
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
type: RollingUpdate
selector:
matchLabels:
app: myapp-ng
environment: production
template:
metadata:
labels:
app: myapp-ng
environment: production
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
readinessProbe:
periodSeconds: 1
httpGet:
path: /
port: http

root@k8s-master:/data/k8s-learn# kubectl apply -f de-example.yaml --record=true
deployment.apps/myapp created
root@k8s-master:/data/k8s-learn# kubectl get rs -n prod
NAME DESIRED CURRENT READY AGE
myapp-b97bcbcc9 4 4 4 7s
root@k8s-master:/data/k8s-learn# kubectl get pods -n prod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
myapp-b97bcbcc9-k4d7w 1/1 Running 0 12s app=myapp-ng,environment=production,pod-template-hash=b97bcbcc9
myapp-b97bcbcc9-qk5xk 1/1 Running 0 12s app=myapp-ng,environment=production,pod-template-hash=b97bcbcc9
myapp-b97bcbcc9-stz5b 1/1 Running 0 12s app=myapp-ng,environment=production,pod-template-hash=b97bcbcc9
myapp-b97bcbcc9-xxwcq 1/1 Running 0 12s app=myapp-ng,environment=production,pod-template-hash=b97bcbcc9

查看回滚历史

root@k8s-master:/data/k8s-learn# kubectl rollout history deployment/myapp -n prod
deployment.apps/myapp
REVISION CHANGE-CAUSE
1 <none>
2 <none>
3 kubectl apply --filename=de-example.yaml --record=tru

回滚,默认向前回滚1

root@k8s-master:/data/k8s-learn# kubectl rollout history deployment/myapp -nprod
deployment.apps/myapp
REVISION CHANGE-CAUSE
1 <none>
2 <none>
3 kubectl apply --filename=de-example.yaml --record=true

--to-revision=0: The revision to rollback to. Default to 0 (last revision).

root@k8s-master:/data/k8s-learn# kubectl rollout history deployment/myapp -n prod
deployment.apps/myapp
REVISION CHANGE-CAUSE
1 <none>
2 <none>
3 kubectl apply --filename=de-example.yaml --record=true

root@k8s-master:/data/k8s-learn# kubectl rollout status deployment/myapp -n prod
deployment "myapp" successfully rolled out
root@k8s-master:/data/k8s-learn# kubectl rollout undo deployment/myapp -n prod
deployment.apps/myapp rolled back
root@k8s-master:/data/k8s-learn# kubectl rollout history deployment/myapp -n prod
deployment.apps/myapp
REVISION CHANGE-CAUSE
1 <none>
3 kubectl apply --filename=de-example.yaml --record=true
4 <none>

</pre>

上一篇 下一篇

猜你喜欢

热点阅读