k8s部署-31-k8s中如何进行资源隔离资源

图片

在k8s中的我们的资源如何隔离呢?如果说有一个服务异常了,内存无限制的占用,其他的服务岂不是无法部署上去了?

而且我们一般一个集群是给很多人,很多对象使用的,那么如何保证他们互不打扰?且无法看到其他人的相关内容呢?

图片

Namespace

一个重要的概念,Namespace,我们之前说过,但是没有细说他的功能是什么,他可以实现资源隔离和配额的隔离,比如下面的信息:

图片

从上图可以清晰的看到他能做什么,接下来实际操作下吧。

新建namespace

首先我们先查询下本地有多少个namespace;

[root@node1 ~]# kubectl get namespace
NAME              STATUS   AGE
default           Active   18d
kube-node-lease   Active   18d
kube-public       Active   18d
kube-system       Active   18d
[root@node1 ~]#

再看下命名空间中都有什么呢?这里我们只查看pod哈。

[root@node1 ~]# kubectl get pods
NAME                                 READY   STATUS    RESTARTS   AGE
deploy-springboot-5dbfc55f78-mpg69   1/1     Running   1          21h
nginx-ds-q2pjt                       1/1     Running   17         11d
nginx-ds-zc5qt                       1/1     Running   22         17d
[root@node1 ~]# kubectl get pods -n kube-node-lease
No resources found in kube-node-lease namespace.
[root@node1 ~]# kubectl get pods -n kube-public
No resources found in kube-public namespace.
[root@node1 ~]# kubectl get pods -n kube-system
NAME                                       READY   STATUS             RESTARTS   AGE
calico-kube-controllers-858c9597c8-6gzd5   1/1     Running            29         17d
calico-node-6k479                          1/1     Running            21         17d
calico-node-bnbxx                          1/1     Running            21         17d
coredns-84646c885d-6fsjk                   1/1     Running            21         17d
coredns-84646c885d-sdb6l                   1/1     Running            21         17d
kube-flannel-ds-d7kvz                      0/1     CrashLoopBackOff   614        11d
kube-flannel-ds-klfvj                      0/1     CrashLoopBackOff   612        11d
nginx-proxy-node3                          1/1     Running            22         18d
nodelocaldns-gj9xf                         1/1     Running            21         17d
nodelocaldns-sw9jh                         1/1     Running            21         17d
[root@node1 ~]#

从上面可以看到,如果不指定命名空间的话,默认访问的是名字为default的命名空间,如果我们想看到其他命名空间下的资源,我们需要手动使用“-n”参数来指定。而且,如果你创建的时候没有指定namespace,那么默认也是都在default这个命名空间下的。

那么接下来我们来创建一个命名空间吧。

[root@node1 ~]# mkdir namespace
[root@node1 ~]# cd namespace/
[root@node1 namespace]# vim create_namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: dev
[root@node1 namespace]# kubectl create -f create_namespace.yaml 
namespace/dev created
[root@node1 namespace]# 

那么我们就创建了一个名字叫dev的命名空间,我们查看下:

[root@node1 namespace]# kubectl get namespace
NAME              STATUS   AGE
default           Active   18d
dev               Active   69s
kube-node-lease   Active   18d
kube-public       Active   18d
kube-system       Active   18d
[root@node1 namespace]#

新建一个pod

[root@node1 namespace]# vim web-demo.yaml 
#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-demo
  namespace: dev
spec:
  selector:
    matchLabels:
      app: web-demo
  replicas: 1
  template:
    metadata:
      labels:
        app: web-demo
    spec:
      containers:
      - name: web-demo
        image: registry.cn-beijing.aliyuncs.com/yunweijia0909/tomcat:jre8-openjdk
        ports:
        - containerPort: 8080
---
#service
apiVersion: v1
kind: Service
metadata:
  name: web-demo
  namespace: dev
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: web-demo
  #type: ClusterIP

---
#ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-demo
  namespace: dev
spec:
  rules:
  - host: web.yunweijia.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web-demo-dev
            port:
              number: 80
[root@node1 namespace]# kubectl apply -f web-demo.yaml 
deployment.apps/web-demo created
service/web-demo created
ingress.networking.k8s.io/web-demo created
[root@node1 namespace]#

然后查看下dev这个命名空间下是否有了;

[root@node1 namespace]# kubectl get pods -n dev
NAME                        READY   STATUS    RESTARTS   AGE
web-demo-58bf7ccc9c-d7gxl   1/1     Running   0          42s
[root@node1 namespace]# kubectl get all -n dev
NAME                            READY   STATUS    RESTARTS   AGE
pod/web-demo-58bf7ccc9c-d7gxl   1/1     Running   0          46s

NAME               TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
service/web-demo   ClusterIP   10.233.101.225   <none>        80/TCP    46s

NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/web-demo   1/1     1            1           46s

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/web-demo-58bf7ccc9c   1         1         1       46s
[root@node1 namespace]#

测试下命名空间的隔离性

首先我们需要在default这个命名空间下新建个两个pod,然后去做测试,因为我现在就有nginx这个pod,所以再启动一个tomcat的pod吧。

如果看过我之前的文章,你应该在default命名空间中有较多的pod,就不用新建了,我这里是演示完就删了,所以没了。

剩余内容请转至VX公众号 “运维家” ,回复 “138” 查看。