namespace是kubernetes系统中的一种非常重要的资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。
默认情况下,kubernetes 集群中的所有Pod都是可以相互访问的。但是在实际中,可能不希望让Pod之间进行相互访问,此时即可将Pod划分到不同的namespace下。
Kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的“组”,以方便不同的组的资源进行隔离使用和管理。
可以通过kubernetes的授权机制,将不同的namespace交给不同租户进行管理。这样就实现了多租户的资源隔离。此时还能结合kubernetes的资源配额机制,限定不同租户能占用的资源,例如CPU使用量、内存使用量等,来实现租户可用资源的管理。
kubernetes在集群启动之后,会默认创建几个namespace
[root@k8s-master ~]# kubectl get namespace
NAME STATUS AGE
default Active 38h # 所有未指定Namespace的对象都会被分配在default 命名空间
kube-node-lease Active 38h # 集群节点之间的心跳维护,v1.13 开始引入
kube-public Active 38h # 此命名空间下的资源可以被所有人访问(包括未认证用户)
kube-system Active 38h # 所有由kubernetes 系统创建的资源都处于这个命名空间
namespace 资源的相关操作:
查看
# 查看所有的ns
[root@k8s-master ~]# kubectl get ns
NAME STATUS AGE
default Active 38h
kube-node-lease Active 38h
kube-public Active 38h
kube-system Active 38h
# 查看指定的ns
# kubectl get ns ns名称
[root@k8s-master ~]# kubectl get ns default
NAME STATUS AGE
default Active 38h
# 指定输出格式
# kubectl get ns ns名称 -o 格式参数
# kubernetes 支持的格式有:wide,json,yaml等
[root@k8s-master ~]# kubectl get ns default -o yaml
[root@k8s-master ~]# kubectl get ns default -o json
# 查看ns详情
[root@k8s-master ~]# kubectl describe ns default
Name: default
Labels: <none>
Annotations: <none>
Status: Active # Active 表示命名空间正在使用中,Terminating 表示正在删除命名空间
No resource quota. # ResourceQuota 针对namespace做的资源限制
No LimitRange resource. # LimitRange 针对 namespace中的各个组件做的资源限制
创建
# 创建namespace
[root@k8s-master ~]# kubectl create ns test
namespace/test created
[root@k8s-master ~]# kubectl get ns test
NAME STATUS AGE
test Active 76s
删除
[root@k8s-master ~]# kubectl delete ns test
namespace "test" deleted
配置方式
# 准备配置文件
[root@k8s-master ~]# vim ns-test.yaml
apiVersion: v1
kind: Namespace
metadata:
name: test
# 创建
[root@k8s-master ~]# kubectl apply -f ns-test.yaml
namespace/test created
# 删除
[root@k8s-master ~]# kubectl delete -f ns-test.yaml
namespace "test" deleted
Pod是kubernetes集群进行管理的最小单元,程序要运行必须部署在容器中,而容器必须存在于Pod中
Pod可以认为是容器的封装,一个Pod中可以存在一个或者多个容器
kubernetes在集群启动之后,集群中的各个组件都是以pod方式运行的,查看如下:
[root@k8s-master ~]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-6955765f44-glr84 1/1 Running 3 39h
coredns-6955765f44-wqvp8 1/1 Running 3 39h
etcd-k8s-master 1/1 Running 7 39h
kube-apiserver-k8s-master 1/1 Running 6 39h
kube-controller-manager-k8s-master 1/1 Running 6 39h
kube-flannel-ds-47fbn 1/1 Running 4 38h
kube-flannel-ds-jrt4p 1/1 Running 4 38h
kube-flannel-ds-zjvqd 1/1 Running 4 38h
kube-proxy-kxxk6 1/1 Running 6 39h
kube-proxy-psqxr 1/1 Running 6 39h
kube-proxy-tvbtt 1/1 Running 6 39h
kube-scheduler-k8s-master 1/1 Running 7 39h
pod 资源的相关操作:
创建并运行
kubernetes没有提供单独运行Pod的命令,都是通过Pod控制器来实现的
Pod在设计支持就不是作为持久化实体的。在调度失败、节点故障、缺少资源或者节点维护的状态下都会死掉会被驱逐。
通常,用户不需要手动直接创建Pod,而是应该使用controller(例如Deployments),即使是在创建单个Pod的情况下。Controller可以提供集群级别的自愈功能、复制和升级管理。
# 命令格式: kubectl run pod控制器名称 [参数]
# --image 指定Pod的镜像
# --port 指定容器暴露的端口
# -n 指定namespace,如果不指定就默认创建在 default 命名空间中
[root@k8s-master ~]# kubectl create ns test
namespace/test created
[root@k8s-master ~]# kubectl run my-nginx --image=nginx:1.17.1 --port=80 -n test
# 确保namespace 是存在的
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/my-nginx created
[root@k8s-master ~]#
查看pod信息
# 查看指定命名空间下的所有pod
# kubectl get pod -n namespace
[root@k8s-master ~]# kubectl get pod -n test
NAME READY STATUS RESTARTS AGE
my-nginx-6b7fbbc894-8z57b 1/1 Running 0 20s
# 上面的 my-nginx-6b7fbbc894-8z57b 这个pod就是由控制器my-nginx创建并管理的
[root@k8s-master ~]# kubectl get deploy -n test
NAME READY UP-TO-DATE AVAILABLE AGE
my-nginx 1/1 1 1 37s
#查看pod更多信息
# kubectl get pod -n namespace -o wide
[root@k8s-master ~]# kubectl get pod -n test -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-nginx-6b7fbbc894-8z57b 1/1 Running 0 5m37s 10.244.1.7 k8s-node01 <none> <none>
# pod名称 当前pod中的容器就绪数/当前pod中的容器个数(pause根容器不计算在内) pod状态 重启次数 启动时常 pod的IP 该pod被调度到哪个节点上运行
# 查看pod的详细信息
# kubectl describe pod pod名 -n namespace
[root@k8s-master ~]# kubectl describe pod my-nginx-6b7fbbc894-4wrvc -n test
访问pod
# 获取pod的IP
[root@k8s-master ~]# kubectl get pod -n test -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-nginx-6b7fbbc894-8z57b 1/1 Running 0 5m37s 10.244.1.7 k8s-node01 <none> <none>
# pod的重启会导致IP变化
# 访问pod
[root@k8s-master ~]# curl 10.244.1.7:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
……省略……
删除指定pod
# kubectl delete pod pod名 -n namespace
[root@k8s-master ~]# kubectl delete pod my-nginx-6b7fbbc894-8z57b -n test
pod "my-nginx-6b7fbbc894-8z57b" deleted
[root@k8s-master ~]# kubectl get pod -n test
NAME READY STATUS RESTARTS AGE
my-nginx-6b7fbbc894-2xl4t 1/1 Running 0 6s
# 发现虽然显示删除成功,但是再查询发现立刻又重启了一个pod,这是因为使用 kubectl run 命令
# 创建的pod默认是会先创建pod控制器,再创建pod。所以此时的pod是由pod控制器管理的,控制器会
# 监控pod的状态,一旦发现pod死亡,会立即重建,这是deployment控制器的功能。
# 所以,此时要删除pod,必须删除该pod的控制器
# 查询该pod的控制器
[root@k8s-master ~]# kubectl get deploy -n test
NAME READY UP-TO-DATE AVAILABLE AGE
my-nginx 1/1 1 1 26m
# 删除该pod控制器
[root@k8s-master ~]# kubectl delete deploy my-nginx -n test
deployment.apps "my-nginx" deleted
# 稍等片刻,再查询,发现pod被删除了(对应pod的控制器被删除,那么该控制器下的pod也会相应自动被删除)
[root@k8s-master ~]# kubectl get deploy -n test
No resources found in test namespace.
配置操作
使用配置文件创建pod
[root@k8s-master ~]# vim pod-nginx.yaml
apiVersion: v1
kind: Pod # 资源类型pod
metadata:
name: my-nginx # 该pod资源的名称
namespace: test # 位于的namespace
spec:
containers: # 指定该pod中镜像相关信息
- image: nginx:1.17.1 # 镜像及版本
imagePullPolicy: IfNotPresent # 镜像拉取策略
name: mypod # 容器名称
ports: # 容器端口相关
- name: nginx-port
containerPort: 80
protocol: TCP
# 创建
[root@k8s-master ~]# kubectl create -f pod-nginx.yaml
pod/my-nginx created
# 查看
[root@k8s-master ~]# kubectl get pod -n test
NAME READY STATUS RESTARTS AGE
my-nginx 1/1 Running 0 10s
# 删除
[root@k8s-master ~]# kubectl delete -f pod-nginx.yaml
pod "my-nginx" deleted
# 或者使用 kubectl delete pod my-nginx -n test 进行删除,因为这种方式创建的pod为自主式pod,不会创建pod的管理器
配置文件中指定 kind为 Pod 时,那么此时创建的pod为单独的(自主式)pod,没有控制器管理的pod
Lable是kubernetes系统中的一个重要概念。它的作用就是在资源上添加标识,用来对它们进行区分和选择。
Label的特点:
可以通过Lable实现资源的多维度分组,以便灵活、方便地进行资源分配、调度、配置、部署等管理工作
—些常用的Label示例如下:
版本标签: "version":""release", "version":"stable"......
环境标签: "environment":"dev" ,"environment":"test","environment":"pro"
架构标签: "tier":"frontend","tier"":"backend"
标签定义完毕之后,还要考虑到标签的选择,这就要使用到 Label Selector,即:
当前有两种Label Selector:
name = slave # 选择所有包含Label中key="name"且value="slave"的对象
env != production # 选择所有包括Label中的 key="env" 且 value 不等于 "production" 的对象
name in (master,slave) # 选择所有包含Label中的key="name"且value="master"或"slave"的对象
name notin (frontend) # 选择所有包含Label中的key=“name"且value不等于"frontend"的对象标签的
选择条件可以使用多个,此时将多个Label Selector进行组合,使用逗号”"进行分隔即可。
例如:
name=slave,env!=production
name not in (frontend),envl=production
命令方式
[root@k8s-master ~]# kubectl get pod -n test
NAME READY STATUS RESTARTS AGE
nginxpod 1/1 Running 0 7m32s
# 为pod资源打标签
# kubectl label 资源 资源名 key=value -n namespace
[root@k8s-master ~]# kubectl label pod nginxpod version=1.0 -n test
pod/nginxpod labeled
# 查看标签
# kubectl get 资源 资源名 -n namespace --show-labels
[root@k8s-master ~]# kubectl get pod nginxpod -n test --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginxpod 1/1 Running 0 9m16s version=1.0
# 为pod资源更新标签
# kubectl label 资源 资源名 'key=value' -n namespace --overwrite
[root@k8s-master ~]# kubectl label pod nginxpod 'version=2.0' -n test --overwrite
pod/nginxpod labeled
[root@k8s-master ~]# kubectl get pod nginxpod -n test --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginxpod 1/1 Running 0 10m version=2.0
# 查看指定资源的指定标签
# kubectl get 资源 -l key=value -n namespace --show-labels
[root@k8s-master ~]# kubectl get pod -l "version=2.0" -n test
NAME READY STATUS RESTARTS AGE
nginxpod 1/1 Running 0 18m
[root@k8s-master ~]# kubectl get pod -l 'version=2.0' -n test --show-labels
# 或者 kubectl get pod -l 'version in (2.0)' -n test --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginxpod 1/1 Running 0 18m version=2.0
# 查看标签中 key=version 但 value 不是2.0和3.0的所有pod资源:
# kubectl get pod -l 'version!=2.0,version!=3.0' -n test
# 或者 kubectl get pod -l 'version notin (2.0,3.0)' -n test
# 删除标签
# kubectl label 资源 资源名 key- -n namespace
[root@k8s-master ~]# kubectl label pod nginxpod version- -n test
pod/nginxpod labeled
[root@k8s-master ~]# kubectl get pod -n test --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginxpod 1/1 Running 0 20m <none>
配置方式
[root@k8s-master ~]# vim lable-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
namespace: test
labels:
version: "4.0"
tier: "fronted"
spec:
containers:
- image: nginx:1.17.1
imagePullPolicy: IfNotPresent
name: nginx-contain
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
[root@k8s-master ~]# kubectl apply -f lable-pod.yaml
pod/nginx-pod created
[root@k8s-master ~]# kubectl get pod -n test --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod 1/1 Running 0 16s tier=fronted,version=4.0
在kubernetes中,pod是最小的控制单元,但是kubernetes很少直接控制pod,一般都是通过Pod控制器来完成的。
Pod控制器用于pod的管理,确保pod资源符合预期的状态,当pod的资源出现故障时,会尝试进行重启或重建pod。
在kubernetes中Pod控制器的种类有很多,Deployment 是其中一种。
使用Deployment 控制器创建的pod,Deployment控制器是通过给自己所创建的pod打上标签label后,从而知道自己所要管理的pod,即Deployment控制器是通过 Label 标签和 选择器 selector 与pod进行关联的
命令操作
#命令格式: kuberctl run deployment名称 [参数]
# --image 指定pod镜像
# --port 指定端口
# -n 指定ns
# --replicas pod格式,默认1个
[root@k8s-master ~]# kubectl run nginx --image=nginx:1.17.1 --port=80 --replicas=3 -n test
deployment.apps/nginx created
#同时查看pod和deploy
[root@k8s-master ~]# kubectl get deploy,pod -n test -o wide --show-labels
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR LABELS
deployment.apps/nginx 3/3 3 3 3m27s nginx nginx:1.17.1 run=nginx run=nginx
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
pod/nginx-64777cd554-2h77z 1/1 Running 0 3m27s 10.244.2.10 k8s-node02 <none> <none> pod-template-hash=64777cd554,run=nginx
pod/nginx-64777cd554-9gwrp 1/1 Running 0 3m27s 10.244.1.13 k8s-node01 <none> <none> pod-template-hash=64777cd554,run=nginx
pod/nginx-64777cd554-gvw96 1/1 Running 0 3m27s 10.244.1.12 k8s-node01 <none> <none> pod-template-hash=64777cd554,run=nginx
# Deployment控制器是通过给自己所创建的pod打上标签label后,从而知道自己所要管理的pod
#查看deployment详情
[root@k8s-master ~]# kubectl describe deploy nginx -n test
Name: nginx
Namespace: test
CreationTimestamp: Mon, 24 May 2021 12:37:02 +0800
Labels: run=nginx
# deployment控制器就是根据pod中的label,run=nginx标签来管理pod,所以在deployment控制器下的pod都会被打上run=nginx的标签
Annotations: deployment.kubernetes.io/revision: 1
Selector: run=nginx
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: run=nginx
Containers:
nginx:
Image: nginx:1.17.1
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: nginx-64777cd554 (3/3 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 13m deployment-controller Scaled up replica set nginx-64777cd554 to 3
#删除deployment (删除后deployment下的pod会被自动删除)
[root@k8s-master ~]# kubectl delete deploy nginx -n test
deployment.apps "nginx" deleted
配置操作
[root@k8s-master ~]# vim deploy-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
namespace: test # 该行及以以上定义了Deployment相关参数
spec:
replicas: 3 # pod副本数
selector: # Deployment 选择器
matchLabels:
app: my-nginx-pod # pod 与 deployment 关联标签(所以在pod中需要定义该标签)
template: # 以下定义Pod模板
metadata:
labels:
app: my-nginx-pod
spec:
containers:
- name: nginx-contain
image: nginx:1.17.1
imagePullPolicy: IfNotPresent
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
[root@k8s-master ~]# kubectl apply -f deploy-nginx.yaml
deployment.apps/nginx-deploy created
[root@k8s-master ~]# kubectl get deploy,pod -n test -o wide --show-labels
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR LABELS
deployment.apps/nginx-deploy 3/3 3 3 2m53s nginx-contain nginx:1.17.1 app=my-nginx-pod <none>
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
pod/nginx-deploy-5dbf5bcdc4-ks5jl 1/1 Running 0 2m53s 10.244.2.12 k8s-node02 <none> <none> app=my-nginx-pod,pod-template-hash=5dbf5bcdc4
pod/nginx-deploy-5dbf5bcdc4-q5dzk 1/1 Running 0 2m53s 10.244.1.16 k8s-node01 <none> <none> app=my-nginx-pod,pod-template-hash=5dbf5bcdc4
pod/nginx-deploy-5dbf5bcdc4-sw8tj 1/1 Running 0 2m53s 10.244.2.13 k8s-node02 <none> <none> app=my-nginx-pod,pod-template-hash=5dbf5bcdc4
[root@k8s-master ~]# kubectl delete -f deploy-nginx.yaml
deployment.apps "nginx-deploy" deleted
通过deployment可以创建一组pod来提供具有高可用性的服务。虽然每个pod都会分配一个ip,然而都存在以下问题:
这样对于访问这个服务带来了难度,因此,kubernetes设计 service 来解决这个问题。
service可以看作是一组同类pod对外的访问接口,借助service,应用可以方便的实现服务发现和负载均衡(类似与反向代理,对后端的pod进行代理)。
service控制器也是基于标签选择器机制来关联和管理对应的pod(Service与Deployment控制器一样都是通过 Label 标签和 选择器 selector 与pod进行关联的),Service在整个生命周期中IP不会改变
操作一:创建集群内部可以访问的service(ClusterIP类型)
# 创建基于deployment管理的pod
[root@k8s-master ~]# vim deploy-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
namespace: test
spec:
replicas: 3
selector:
matchLabels:
app: my-nginx-pod
template:
metadata:
labels:
app: my-nginx-pod
spec:
containers:
- name: nginx-contain
image: nginx:1.17.1
imagePullPolicy: IfNotPresent
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
[root@k8s-master ~]# kubectl apply -f deploy-nginx.yaml
deployment.apps/nginx-deploy created
# 查看运行状态
[root@k8s-master ~]# kubectl get deploy,pod -n test -o wide --show-labels
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR LABELS
deployment.apps/nginx-deploy 3/3 3 3 2m53s nginx-contain nginx:1.17.1 app=my-nginx-pod <none>
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
pod/nginx-deploy-5dbf5bcdc4-ks5jl 1/1 Running 0 2m53s 10.244.2.12 k8s-node02 <none> <none> app=my-nginx-pod,pod-template-hash=5dbf5bcdc4
pod/nginx-deploy-5dbf5bcdc4-q5dzk 1/1 Running 0 2m53s 10.244.1.16 k8s-node01 <none> <none> app=my-nginx-pod,pod-template-hash=5dbf5bcdc4
pod/nginx-deploy-5dbf5bcdc4-sw8tj 1/1 Running 0 2m53s 10.244.2.13 k8s-node02 <none> <none> app=my-nginx-pod,pod-template-hash=5dbf5bcdc4
#暴露service
[root@k8s-master ~]# kubectl expose deploy nginx-deploy --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n test
service/svc-nginx1 exposed
# expose deploy nginx-deploy 将名为nginx-deploy的deployment管理器所管理的pod进行暴露
# --name 指定Service名称
# --type service类型,ClusterIp这个类型是只有在集群内部才可以访问的(不指定--type 默认为ClusterIp类型);NodePort类型可以使得集群外部可以访问到service
# --port service 上的端口
# --target-port 对应到pod中的容器上的端口
# 查看service
[root@k8s-master ~]# kubectl get svc -n test -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
svc-nginx1 ClusterIP 10.105.172.88 <none> 80/TCP 35s app=my-nginx-pod
# 这里产生的ClusterIP,就是该service的IP。在service的生命周期中,这个ip地址是不会变动的
# 可以通过service这个IP访问到其后对应的三个容器中的任意一个(具体访问到哪个容器有一定的算法调度)
[root@k8s-master ~]# kubectl describe svc svc-nginx1 -n test
Name: svc-nginx1
Namespace: test
Labels: <none>
Annotations: <none>
Selector: app=my-nginx-pod
Type: ClusterIP
IP: 10.105.172.88
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.1.16:80,10.244.2.12:80,10.244.2.13:80 # 该service后对应的三个容器地址
Session Affinity: None
Events: <none>
# 访问该service
[root@k8s-master ~]# curl 10.105.172.88:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
# 删除service (删除service不会影响到deploy和pod)
[root@k8s-master ~]# kubectl delete svc svc-nginx1 -n test
service "svc-nginx1" deleted
配置方式
[root@k8s-node01 ~]# kubectl get deploy -n test --show-labels
NAME READY UP-TO-DATE AVAILABLE AGE LABELS
nginx-deploy 3/3 3 3 77m <none>
[root@k8s-node01 ~]# kubectl get pod -n test --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-deploy-5dbf5bcdc4-b5944 1/1 Running 0 77m app=my-nginx-pod,pod-template-hash=5dbf5bcdc4
nginx-deploy-5dbf5bcdc4-hxpbf 1/1 Running 0 77m app=my-nginx-pod,pod-template-hash=5dbf5bcdc4
nginx-deploy-5dbf5bcdc4-ll46v 1/1 Running 0 77m app=my-nginx-pod,pod-template-hash=5dbf5bcdc4
# 使用上面创建好的pod
# 编写配置文件 (ClusterIP类型)
[root@k8s-master ~]# vim svc-nginx3.yaml
apiVersion: v1
kind: Service
metadata:
name: svc-nginx3
namespace: test
spec:
selector:
app: my-nginx-pod
type: ClusterIP
clusterIP: 10.96.96.96 # 该service的IP(不写的话会自动分配,写的话要符合之前在使用 kubeadm init 命令创建集群时指定的service网段,即 --service-cidr= 参数所指定的网段)
ports:
- port: 80 # service端口
protocol: TCP
targetPort: 80 # 容器端口
# 创建
[root@k8s-master ~]# kubectl create -f svc-nginx.yaml
# 查看该svc
[root@k8s-master ~]# kubectl get svc -n test --show-labels -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR LABELS
svc-nginx3 ClusterIP 10.96.96.96 <none> 80/TCP 3m38s app=my-nginx-pod <none>
# 访问
[root@k8s-master ~]# curl 10.96.96.96
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
……省略……
# 删除
[root@k8s-master ~]# kubectl delete svc svc-nginx3 -n test
service "svc-nginx3" deleted
操作二:创建集群外部可以访问的Service (NodePort类型)
# 上面创建的Service的type类型为ClusterIP,这个ip地址只有集群内部可以访问
# 如果需要创建外部也可以访问的service,就需要修改type类型为NodePort
# 暴露
[root@k8s-master ~]# kubectl expose deploy nginx-deploy --name=svc-nginx2 --type=NodePort --port=80 --target-port=80 -n test
service/svc-nginx2 exposed
# 查看
[root@k8s-master ~]# kubectl get svc -n test -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
svc-nginx2 NodePort 10.102.49.10 <none> 80:30093/TCP 33s app=my-nginx-pod
# 此时查看,会发现出现了NodePort类型的service。而且有一对port(80:30093/TCP)
[root@k8s-master ~]# kubectl describe svc svc-nginx2 -n test
Name: svc-nginx2
Namespace: test
Labels: <none>
Annotations: <none>
Selector: app=my-nginx-pod
Type: NodePort
IP: 10.102.49.10
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 30093/TCP
Endpoints: 10.244.1.17:80,10.244.2.14:80,10.244.2.15:80
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
# 接下来就可以通过集群外的主机访问 节点IP:30093访问服务了,当然内部可以使用 ClusterIP:80 也可以访问到
[root@k8s-master ~]# ifconfig ens32 | awk 'NR==2 {print $2}'
192.168.126.100
# 在windows电脑上通过浏览器访问
http://192.168.126.100:30093
# 删除service(删除service不会影响到deploy和pod)
[root@k8s-master ~]# kubectl delete svc svc-nginx2 -n test
service "svc-nginx2" deleted
配置方式
[root@k8s-master ~]# kubectl get deploy -n test --show-labels
NAME READY UP-TO-DATE AVAILABLE AGE LABELS
nginx-deploy 3/3 3 3 134m <none>
[root@k8s-master ~]# kubectl get pod -n test --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-deploy-5dbf5bcdc4-b5944 1/1 Running 0 135m app=my-nginx-pod,pod-template-hash=5dbf5bcdc4
nginx-deploy-5dbf5bcdc4-hxpbf 1/1 Running 0 135m app=my-nginx-pod,pod-template-hash=5dbf5bcdc4
nginx-deploy-5dbf5bcdc4-ll46v 1/1 Running 0 135m app=my-nginx-pod,pod-template-hash=5dbf5bcdc4
# 使用上面创建好的pod
# 编写配置文件 (NodePort类型)
[root@k8s-master ~]# vim svc-nginx4.yaml
apiVersion: v1
kind: Service
metadata:
name: svc-nginx4 # 该service 名字
namespace: test # 该service 所属命名空间
spec:
selector:
app: my-nginx-pod # 该service关联到具有标签 app=my-nginx-pod 的pod
type: NodePort # NodePort 类型
clusterIP: 10.96.10.10 # 该service的IP(不写的话会自动分配,写的话要符合之前在使用 kubeadm init 命令创建集群时指定的service网段,即 --service-cidr 参数所指定的网段)
ports:
- port: 80 # 该service端口
protocol: TCP
targetPort: 80 # pod中容器端口
nodePort: 30000 # 节点端口
# 外部访问节点的3000端口会转发到service的80端口,service的80端口再转发到容器的80端口
# 创建
[root@k8s-master ~]# kubectl create -f svc-nginx4.yaml
service/svc-nginx4 created
# 查看
[root@k8s-master ~]# kubectl get svc -n test -o wide --show-labels
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR LABELS
svc-nginx4 NodePort 10.96.10.10 <none> 80:30000/TCP 14s app=my-nginx-pod <none>
# 内部访问
[root@k8s-master ~]# curl 10.96.10.10
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
……省略……
# 外部访问
[root@k8s-master ~]# ifconfig ens32 | awk 'NR==2 {print $2}'
192.168.126.100
# 在windows电脑上通过浏览器访问
http://192.168.126.100:30000
# 删除 (删除service不会影响到deploy和pod)
[root@k8s-master ~]# kubectl delete -f svc-nginx4.yaml
service "svc-nginx4" deleted