K8Sv1.18-04.k8s的实战

04.k8s的实战

1 前言

介绍如何在kubernetes集群中部署一个Nginx服务,并且能够对其访问。

2 Namespace

2.1 概述

Namespace是kubernetes系统中一种非常重要的资源,它的主要作用是用来实现多套系统的资源隔离或者多租户的资源隔离。
默认情况下,kubernetes集群中的所有Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,那么此时就可以将两个Pod划分到不同的Namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的“组”,以方便不同的组的资源进行隔离使用和管理。
可以通过kubernetes的授权机制,将不同的Namespace交给不同租户进行管理,这样就实现了多租户的资源隔离。此时还能结合kubernetes的资源配额机制,限定不同租户能占用的资源,例如CPU使用量、内存使用量等等,来实现租户可用资源的管理。

  • kubernetes在集群启动之后,会默认创建几个namespace。
1
2
3
4
5
6
7
[root@k8s-master ~]# kubectl get namespace
NAME STATUS AGE
default Active 24h
dev Active 45m
kube-node-lease Active 24h
kube-public Active 24h
kube-system Active 24h

default:所有未指定的Namespace的对象都会被分配在default命名空间。
kube-node-lease:集群节点之间的心跳维护,v1.13开始引入。
kube-public:此命名空间的资源可以被所有人访问(包括未认证用户)。
kube-system:所有由kubernetes系统创建的资源都处于这个命名空间。

kube-system空间内默认已经包含系统自带的节点了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@k8s-master ~]# kubectl get pods -n kube-system 
NAME READY STATUS RESTARTS AGE
coredns-7ff77c879f-4sj5v 1/1 Running 0 24h
coredns-7ff77c879f-5w2fs 1/1 Running 0 24h
etcd-k8s-master 1/1 Running 0 24h
kube-apiserver-k8s-master 1/1 Running 0 24h
kube-controller-manager-k8s-master 1/1 Running 0 24h
kube-flannel-ds-f5x79 1/1 Running 0 24h
kube-flannel-ds-gdtb8 1/1 Running 0 24h
kube-flannel-ds-zsr7d 1/1 Running 0 24h
kube-proxy-c97ls 1/1 Running 0 24h
kube-proxy-hc85h 1/1 Running 0 24h
kube-proxy-rskjd 1/1 Running 0 24h
kube-scheduler-k8s-master 1/1 Running 0 24h

2.2 应用示例

  • 示例:查看所有的命名空间
1
2
3
4
5
6
7
[root@k8s-master ~]# kubectl get namespace
NAME STATUS AGE
default Active 24h
dev Active 60m
kube-node-lease Active 24h
kube-public Active 24h
kube-system Active 24h
  • 缩写
1
2
3
4
5
6
7
[root@k8s-master ~]# kubectl get ns
NAME STATUS AGE
default Active 24h
dev Active 60m
kube-node-lease Active 24h
kube-public Active 24h
kube-system Active 24h
  • 查看指定某个命名空间
1
2
3
[root@k8s-master ~]# kubectl get ns default 
NAME STATUS AGE
default Active 24h
  • 查看指定某个空间的详情
1
2
3
4
5
6
7
8
9
[root@k8s-master ~]# kubectl describe ns default 
Name: default
Labels: <none>
Annotations: <none>
Status: Active

No resource quota. # 针对命名空间做的资源限制

No LimitRange resource. # 针对命名空间中每个组件做的资源限制
  • 示例:创建命名空间
1
2
[root@k8s-master ~]# kubectl create namespace dev
namespace/dev created
  • 示例:删除命名空间
1
2
[root@k8s-master ~]# kubectl delete ns dev
namespace "dev" deleted
  • 示例:命令式对象配置
  • ① 新建ns-dev.yaml:
1
2
3
4
apiVersion: v1
kind: Namespace
metadata:
name: dev
  • ② 通过命令式对象配置进行创建和删除:
1
2
3
4
5
[root@k8s-master ~]# kubectl create -f ns-dev.yaml
namespace/dev created

[root@k8s-master ~]# kubectl delete -f ns-dev.yaml
namespace "dev" deleted

3 Pod

3.1 概述

  • Pod是kubernetes集群进行管理的最小单元,程序要运行必须部署在容器中,而容器必须存在于Pod中。
  • Pod可以认为是容器的封装,一个Pod中可以存在一个或多个容器。
  • kubernetes在集群启动之后,集群中的各个组件也是以Pod方式运行的,可以通过下面的命令查看:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@k8s-master ~]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-7ff77c879f-4sj5v 1/1 Running 0 40h
coredns-7ff77c879f-5w2fs 1/1 Running 0 40h
etcd-k8s-master 1/1 Running 0 40h
kube-apiserver-k8s-master 1/1 Running 0 40h
kube-controller-manager-k8s-master 1/1 Running 0 40h
kube-flannel-ds-f5x79 1/1 Running 0 40h
kube-flannel-ds-gdtb8 1/1 Running 0 40h
kube-flannel-ds-zsr7d 1/1 Running 0 40h
kube-proxy-c97ls 1/1 Running 0 40h
kube-proxy-hc85h 1/1 Running 0 40h
kube-proxy-rskjd 1/1 Running 0 40h
kube-scheduler-k8s-master 1/1 Running 0 40h

3.2 语法及应用示例

  • 语法:创建并运行Pod

kubernetes没有提供单独运行Pod的命令,都是通过Pod控制器来实现的

1
2
3
4
kubectl run (Pod的名称) [参数]
# --image 指定Pod的镜像
# --port 指定端口
# --namespace 指定namespace
  • 示例:在名称为dev的namespace下创建一个Nginx的Pod
1
2
[root@k8s-master ~]# kubectl create namespace dev
namespace/dev created
1
2
[root@k8s-master ~]# kubectl run nginx --image=nginx:1.17.1 --port=80 --namespace=dev
pod/nginx created
  • 示例:查询名称为dev的namespace下的所有Pod的基本信息
1
2
3
[root@k8s-master ~]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 2m
  • 语法:查看Pod的详细信息
1
2
3
[root@k8s-master ~]# kubectl get pod -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 3m19s 10.244.1.7 k8s-node1 <none> <none>
  • 示例:查看名称为dev的namespace下的Pod的名称为nginx的详细信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
[root@k8s-master ~]# kubectl describe pod nginx -n dev
Name: nginx
Namespace: dev
Priority: 0
Node: k8s-node1/192.168.117.101
Start Time: Thu, 12 May 2022 09:16:10 +0800
Labels: run=nginx
Annotations: <none>
Status: Running
IP: 10.244.1.7
IPs:
IP: 10.244.1.7
Containers:
nginx:
Container ID: docker://a8ee9d63bdc9dc77433fbbeb53b38b2a80bba2e5c47af3bc2e54ab09dbf5cd1a
Image: nginx:1.17.1
Image ID: docker-pullable://nginx@sha256:b4b9b3eee194703fc2fa8afa5b7510c77ae70cfba567af1376a573a967c03dbb
Port: 80/TCP
Host Port: 0/TCP
State: Running
Started: Thu, 12 May 2022 09:16:11 +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-9vjqc (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
default-token-9vjqc:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-9vjqc
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 5m38s default-scheduler Successfully assigned dev/nginx to k8s-node1
Normal Pulled 5m37s kubelet, k8s-node1 Container image "nginx:1.17.1" already present on machine
Normal Created 5m37s kubelet, k8s-node1 Created container nginx
Normal Started 5m37s kubelet, k8s-node1 Started container nginx
  • 语法:Pod的访问
1
2
# 获取Pod的IP
kubectl get pods [-n dev] -o wide
1
2
# 通过curl访问
curl ip:端口
  • 示例:访问Nginx的Pod
1
2
3
[root@k8s-master ~]# kubectl get pods -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 17m 10.244.1.7 k8s-node1 <none> <none>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@k8s-master ~]# curl 10.244.1.7:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
  • 语法:删除指定的Pod
1
kubectl delete pod pod的名称 [-n 命名空间]
  • 示例:删除Nginx的Pod
1
2
[root@k8s-master ~]# kubectl delete pod nginx -n dev
pod "nginx" deleted
  • 示例:命令式对象配置
  • ① 新建pod-nginx.yaml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: dev
spec:
containers:
- image: nginx:1.17.1
imagePullPolicy: IfNotPresent
name: pod
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
  • ② 执行创建和删除命令:
1
2
3
4
5
[root@k8s-master ~]# kubectl create -f pod-nginx.yaml
pod/nginx created

[root@k8s-master ~]# kubectl delete -f pod-nginx.yaml
pod "nginx" deleted

4 Label

4.1 概述

  • Label是kubernetes的一个重要概念。它的作用就是在资源上添加标识,用来对它们进行区分和选择。
  • Label的特点:
    • 一个Label会以key/value键值对的形式附加到各种对象上,如Node、Pod、Service等。
    • 一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上去。
    • Label通常在资源对象定义时确定,当然也可以在对象创建后动态的添加或删除。
  • 可以通过Label实现资源的多纬度分组,以便灵活、方便地进行资源分配、调度、配置和部署等管理工作。

一些常用的Label标签示例如下:
版本标签:“version”:”release”, ”version”:”stable”
环境标签:“environment”:”dev”, “environment”:”test”, “environment”:”pro”
架构标签:“tier”:”frontend”, ”tier”:”backend”

  • 标签定义完毕之后,还要考虑到标签的选择,这就要用到Label Selector,即:
    • Label用于给某个资源对象定义标识。
    • Label Selector用于查询和筛选拥有某些标签的资源对象。
  • 当前有两种Label Selector:
    • 基于等式的Label Selector。
      • name=slave:选择所有包含Label中的key=“name”并且value=“slave”的对象。
      • env!=production:选择所有包含Label中的key=“env”并且value!=“production”的对象。
    • 基于集合的Label Selector。
      • name in (master,slave):选择所有包含Label中的key=“name”并且value=“master”或value=“slave”的对象。
      • name not in (master,slave):选择所有包含Label中的key=“name”并且value!=“master”和value!=“slave”的对象。
  • 标签的选择条件可以使用多个,此时将多个Label Selector进行组合,使用逗号(,)进行分隔即可。
    • name=salve,env!=production。
    • name not in (master,slave),env!=production。

4.2 语法及应用示例

  • 语法:为资源打标签
1
kubectl label pod xxx key=value [-n 命名空间]
  • 首先查看当前Pod的标签情况
1
2
3
[root@k8s-master ~]# kubectl get pod -n dev --show-labels 
NAME READY STATUS RESTARTS AGE LABELS
nginx 1/1 Running 0 38s <none>
  • 示例:为Nginx的Pod打上标签
1
2
3
4
5
6
[root@k8s-master ~]# kubectl label pod nginx version=1.0 -n dev
pod/nginx labeled

[root@k8s-master ~]# kubectl get pod -n dev --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx 1/1 Running 0 2m24s version=1.0
  • 语法:更新资源的标签
1
kubectl label pod xxx key=value [-n 命名空间] --overwrite
  • 示例:为Nginx的Pod更新标签
1
2
3
4
5
6
[root@k8s-master ~]# kubectl label pod nginx version=2.0 -n dev --overwrite
pod/nginx labeled

[root@k8s-master ~]# kubectl get pod -n dev --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx 1/1 Running 0 6m12s version=2.0
  • 语法:查看标签
1
kubectl get pod xxx [-n 命名空间] --show-labels
  • 示例:显示Nginx的Pod的标签
1
kubectl get pod nginx -n dev --show-labels
  • 示例:筛选版本号是2.0的在名称为dev的namespace下的Pod
1
2
3
4
5
6
7
8
9
10
11
12
[root@k8s-master ~]# kubectl get pod -n dev --show-labels 
NAME READY STATUS RESTARTS AGE LABELS
nginx 1/1 Running 0 10m version=2.0
nginx1 1/1 Running 0 89s version=1.0

[root@k8s-master ~]# kubectl get pod -l "version=2.0" -n dev --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx 1/1 Running 0 10m version=2.0

[root@k8s-master ~]# kubectl get pod -l "version!=2.0" -n dev --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx1 1/1 Running 0 2m version=1.0
  • 语法:删除标签
1
kubectl label pod xxx key- [-n 命名空间]
  • 示例:删除名称为dev的namespace下的Nginx的Pod上的标签
1
2
3
4
5
6
7
[root@k8s-master ~]# kubectl label pod nginx version- -n dev
pod/nginx labeled

[root@k8s-master ~]# kubectl get pod -n dev --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx 1/1 Running 0 13m <none>
nginx1 1/1 Running 0 4m50s version=1.0
  • 示例:命令式对象配置

  • ① 新建pod-nginx.yaml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: dev
labels:
version: "3.0"
env: "test"
spec:
containers:
- image: nginx:1.17.1
imagePullPolicy: IfNotPresent
name: pod
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
  • ② 执行创建和删除命令:
1
2
3
4
5
6
7
8
[root@k8s-master ~]# kubectl apply -f pod-nginx.yaml 
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
pod/nginx configured

[root@k8s-master ~]# kubectl get pod -n dev --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx 1/1 Running 0 19m env=test,version=3.0
nginx1 1/1 Running 0 10m version=1.0

5 Deployment

5.1 概述

在kubernetes中,Pod是最小的控制单元,但是kubernetes很少直接控制Pod,一般都是通过Pod控制器来完成的。
Pod控制器用于Pod的管理,确保Pod资源符合预期的状态,当Pod的资源出现故障的时候,会尝试进行重启或重建Pod。
在kubernetes中Pod控制器的种类有很多,本章节只介绍一种:Deployment。

5.2 语法及应用示例

特别注意:在v1.18版之后,kubectl run nginx –image=nginx –replicas=2 –port=80,会反馈Flag –replicas has been deprecated, has no effect and will be removed in the future,并且只会创建一个Nginx容器实例。

  • 语法:创建指定名称的deployement
1
2
3
kubectl create deployment xxx [-n 命名空间]

kubectl create deploy xxx [-n 命名空间]
  • 示例:在名称为test的命名空间下创建名为nginx的deployment
1
kubectl create deployment nginx --image=nginx:1.17.1 -n test
  • 语法:命令式对象配置

  • ① 创建一个deploy-nginx.yaml,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: dev
spec:
replicas: 3
selector:
matchLabels:
run: nginx
template:
metadata:
labels:
run: nginx
spec:
containers:
- image: nginx:1.17.1
name: nginx
ports:
- containerPort: 80
protocol: TCP
  • ② 执行创建和删除命令:
1
2
3
kubectl create -f deploy-nginx.yaml

kubectl delete -f deploy-nginx.yaml
  • 语法:查看创建的Pod
1
kubectl get pods [-n 命名空间]
  • 示例:查看名称为dev的namespace下通过deployment创建的3个Pod
1
kubectl get pods -n dev
  • 语法:查看deployment的信息
1
2
3
kubectl get deployment [-n 命名空间]

kubectl get deploy [-n 命名空间]
  • 示例:查看名称为dev的namespace下的deployment
1
kubectl get deployment -n dev
  • 语法:查看deployment的详细信息
1
2
3
kubectl describe deployment xxx [-n 命名空间]

kubectl describe deploy xxx [-n 命名空间]
  • 示例:查看名为dev的namespace下的名为nginx的deployment的详细信息
1
kubectl describe deployment nginx -n dev
  • 语法:删除deployment
1
2
3
kubectl delete deployment xxx [-n 命名空间]

kubectl delete deploy xxx [-n 命名空间]
  • 示例:删除名为dev的namespace下的名为nginx的deployment
1
kubectl delete deployment nginx -n dev

6 Service

6.1 概述

我们已经能够利用Deployment来创建一组Pod来提供具有高可用性的服务,虽然每个Pod都会分配一个单独的Pod的IP地址,但是却存在如下的问题:
Pod的IP会随着Pod的重建产生变化。
Pod的IP仅仅是集群内部可见的虚拟的IP,外部无法访问。


K8Sv1.18-04.k8s的实战
https://www.gasmaze.com/posts/f1699b59.html
作者
GasMaze
发布于
2022年7月28日
许可协议