k8s Dashboard 仪表盘

一、 查看 Dashboard 部署信息

1 查看pod

kubectl get po -n kube-system # -n 指命名空间
在这里插入图片描述

2 查看service

kubectl get svc -n kube-system
在这里插入图片描述
https协议访问,映射的端口号30042访问 https://192.168.64.191:30042/

在这里插入图片描述

3 获取令牌token

# 获取 Bearer Token,复制输出中 ‘token:’ 开头那一行
k -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')

在这里插入图片描述

4 查看集群信息

[root@localhost ~]# k cluster-info | grep dashboard
kubernetes-dashboard is running at https://127.0.0.1:6443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy

二、创建RC

apiVersion: v1
kind: ReplicationController        # 资源类型
metadata:   
  name: kubia                      # 为RC命名
spec:
  replicas: 3                      # pod副本的数量
  selector:                        # 选择器,用来选择RC管理的pod
    app: kubia                     # 选择标签'app=kubia'的pod,由当前RC进行管理
  template:                        # pod模板,用来创建新的pod
    metadata:
      labels:
        app: kubia                 # 指定pod的标签
    spec:
      containers:                  # 容器配置
      - name: kubia                # 容器名
        image: luksa/kubia         # 镜像
        imagePullPolicy: Never
        ports:
        - containerPort: 8080      # 容器暴露的端口

在这里插入图片描述
在这里插入图片描述
给容器添加标签 kubectl label po kubia-bg6mzl type=special
编辑控制器模板,已经启动的容器不会应用新的配置,新创建的容器才会应用新的配置 kubectl edit rc kubia
测试可将分片的数量增加,就会新创建一个容器,应用新的配置,有新的标签

三、ReplicaSet

ReplicaSet 是 ReplicationController的增强版,有更多的选择器功能

cat <<EOF > kubia-replicaset.yml
apiVersion: apps/v1              # RS 是 apps/v1中提供的资源类型
kind: ReplicaSet                 # 资源类型
metadata:
  name: kubia                    # RS 命名为 kubia
spec:
  replicas: 3                    # pod 副本数量
  selector:
    matchLabels:                 # 使用 label 选择器
      app: kubia                 # 选取标签是 "app=kubia" 的pod
  template:
    metadata:
      labels:
        app: kubia               # 为创建的pod添加标签 "app=kubia"
    spec:
      containers:
      - name: kubia              # 容器名
        image: luksa/kubia       # 镜像
        imagePullPolicy: Never
EOF

创建 ReplicaSet

k create -f kubia-replicaset.yml

# 之前脱离管理的pod被RS管理
# 设置的pod数量是3,多出的pod会被关闭
k get rs
----------------------------------------
NAME    DESIRED   CURRENT   READY   AGE
kubia   3         3         3       4s

# 多出的3个pod会被关闭
k get pods --show-labels
----------------------------------------------------------------------
NAME             READY   STATUS        RESTARTS   AGE     LABELS
kubia-8d9jj      1/1     Pending       0          2m23s   app=kubia,foo=bar
kubia-lc5qv      1/1     Terminating   0          3d5h    app=kubia
kubia-lhj4q      1/1     Terminating   0          2d22h   app=kubia
kubia-pjs9n      1/1     Running       0          3d5h    app=kubia
kubia-wb8sv      1/1     Pending       0          2m17s   app=kubia,foo=bar
kubia-xp4jv      1/1     Terminating   0          2m17s   app=kubia,foo=bar

# 查看RS描述, 与RC几乎相同
k describe rs kubia

使用更强大的标签选择器

cat <<EOF > kubia-replicaset.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: kubia
spec:
  replicas: 4
  selector:
    matchExpressions:       # 表达式匹配选择器
      - key: app            # label 名是 app
        operator: In        # in 运算符
        values:             # label 值列表
          - kubia
          - foo
  template:
    metadata:
      labels:
        app: kubia
    spec:
      containers:
      - name: kubia
        image: luksa/kubia
        imagePullPolicy: Never
EOF
# 先删除现有 RS
k delete rs kubia --cascade=false
或
kubectl delete rs  kubia  --cascade=orphan #--cascade=orphan指不级联删除容器

# 再创建 RS
k create -f kubia-replicaset.yml

# 查看rs
k get rs
# 查看pod
k get po --show-labels

可使用的运算符:

  • In: label与其中一个值匹配
  • NotIn: label与任何一个值都不匹配
  • Exists: 包含指定label名称(值任意)
  • DoesNotExists: 不包含指定的label

清理

k delete rs kubia

k get rs
k get po

四、DaemonSet

在每个节点上运行一个 pod,例如资源监控,kube-proxy等,
DaemonSet不指定pod数量,它会在每个节点上部署一个pod

cat <<EOF > ssd-monitor-daemonset.yml
apiVersion: apps/v1
kind: DaemonSet                       # 资源类型
metadata:
  name: ssd-monitor                   # DS资源命名
spec:
  selector:
    matchLabels:                      # 标签匹配器
      app: ssd-monitor                # 匹配的标签
  template:
    metadata:
      labels:
        app: ssd-monitor              # 创建pod时,添加标签
    spec:
      containers:                     # 容器配置
        - name: main                  # 容器命名
          image: luksa/ssd-monitor    # 镜像
          imagePullPolicy: Never
EOF

创建 DS

DS 创建后,会在所有节点上创建pod,包括master

k create -f ssd-monitor-daemonset.yml

k get po -o wide
-------------------------------------------------------------------------------------------------------------------------
NAME                READY   STATUS    RESTARTS   AGE     IP            NODE             NOMINATED NODE   READINESS GATES
ssd-monitor-g7fjb   1/1     Running   0          57m     172.20.1.12   192.168.64.192   <none>           <none>
ssd-monitor-qk6t5   1/1     Running   0          57m     172.20.2.14   192.168.64.193   <none>           <none>
ssd-monitor-xxbq8   1/1     Running   0          57m     172.20.0.2    192.168.64.191   <none>           <none>

可以在所有选定的节点上部署pod

通过节点的label来选择节点

cat <<EOF > ssd-monitor-daemonset.yml
apiVersion: apps/v1
kind: DaemonSet                       
metadata:
  name: ssd-monitor                   
spec:
  selector:
    matchLabels:                      
      app: ssd-monitor                
  template:
    metadata:
      labels:
        app: ssd-monitor              
    spec:
      nodeSelector:                   # 节点选择器
        disk: ssd                     # 选择的节点上具有标签: 'disk=ssd'
      containers:                     
        - name: main                  
          image: luksa/ssd-monitor   
          imagePullPolicy: Never
EOF
# 先清理
k delete ds ssd-monitor
# 再重新创建
k create -f ssd-monitor-daemonset.yml

查看 DS 和 pod, 看到并没有创建pod,这是因为不存在具有disk=ssd标签的节点

k get ds

k get po

为节点’192.168.64.191’设置标签 disk=ssd kubectl label no 192.168.64.191 disk=ssd
这样 DS 会在该节点上立即创建 pod

删除’192.168.64.192’节点上的disk标签,kubectl label no 192.168.64.192 disk-那么该节点中部署的pod会被立即销毁

五、Job

Job 用来运行单个任务,任务结束后pod不再重启

cat <<EOF > exporter.yml
apiVersion: batch/v1                 # Job资源在batch/v1版本中提供
kind: Job                            # 资源类型
metadata: 
  name: batch-job                    # 资源命名
spec:
  template: 
    metadata:
      labels:
        app: batch-job               # pod容器标签
    spec:
      restartPolicy: OnFailure       # 任务失败时重启
      containers:
        - name: main                 # 容器名
          image: luksa/batch-job     # 镜像
          imagePullPolicy: Never
EOF

创建 job

镜像 batch-job 中的进程,运行120秒后会自动退出

k create -f exporter.yml

k get job
-----------------------------------------
NAME        COMPLETIONS   DURATION   AGE
batch-job   0/1                      7s

k get po
-------------------------------------------------------------
NAME              READY   STATUS              RESTARTS   AGE
batch-job-q97zf   0/1     ContainerCreating   0          7s

使用Job让pod连续运行5次

先创建第一个pod,等第一个完成后后,再创建第二个pod,以此类推,共顺序完成5个pod

cat <<EOF > multi-completion-batch-job.yml
apiVersion: batch/v1
kind: Job
metadata: 
  name: multi-completion-batch-job
spec:
  completions: 5                    # 指定完整的数量
  template: 
    metadata:
      labels:
        app: batch-job
    spec:
      restartPolicy: OnFailure
      containers:
        - name: main
          image: luksa/batch-job
          imagePullPolicy: Never
EOF

共完成5个pod,并每次可以同时启动两个pod

cat <<EOF > multi-completion-parallel-batch-job.yml
apiVersion: batch/v1
kind: Job
metadata: 
  name: multi-completion-parallel-batch-job
spec:
  completions: 5                    # 共完成5个
  parallelism: 2                    # 可以有两个pod同时执行
  template: 
    metadata:
      labels:
        app: batch-job
    spec:
      restartPolicy: OnFailure
      containers:
        - name: main
          image: luksa/batch-job
          imagePullPolicy: Never
EOF

六、Cronjob

定时和重复执行的任务
cron时间表格式: "分钟 小时 每月的第几天 月 星期几"

cat <<EOF > cronjob.yml
apiVersion: batch/v1beta1                # api版本
kind: CronJob                            # 资源类型
metadata:
  name: batch-job-every-fifteen-minutes
spec:
  # 0,15,30,45  - 分钟
  # 第一个*  -  每个小时
  # 第二个*  -  每月的每一天
  # 第三个*  -  每月
  # 第四个*  -  每一周中的每一天
  schedule: "0,15,30,45 * * * *"
  jobTemplate:
    spec:
      template:
        metadata:
          labels:
            app: periodic-batch-job
        spec:
          restartPolicy: OnFailure
          containers: 
          - name: main
            image: luksa/batch-job
            imagePullPolicy: Never
EOF

创建cronjob

k create -f cronjob.yml

# 立即查看 cronjob,此时还没有创建pod
k get cj
----------------------------------------------------------------------------------------------
NAME                              SCHEDULE             SUSPEND   ACTIVE   LAST SCHEDULE   AGE
batch-job-every-fifteen-minutes   0,15,30,45 * * * *   False     1        27s             2m17s


# 到0,15,30,45分钟时,会创建一个pod
k get po
--------------------------------------------------------------------------------------
NAME                                               READY   STATUS      RESTARTS   AGE
batch-job-every-fifteen-minutes-1567649700-vlmdw   1/1     Running     0          36s

七、Service

通过Service资源,为多个pod提供一个单一不变的接入地址

cat <<EOF > kubia-svc.yml
apiVersion: v1
kind: Service                # 资源类型
metadata:
  name: kubia                # 资源命名
spec:
  ports:
  - port: 80                 # Service向外暴露的端口
    targetPort: 8080         # 容器的端口
  selector:
    app: kubia               # 通过标签,选择名为kubia的所有pod
EOF

如果没有pod具有app:kubia标签,可以创建前面的ReplicaSet资源,并让RS自动创建pod

k create -f kubia-replicaset.yml

在这里插入图片描述

[root@localhost ~]# k get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.68.0.1      <none>        443/TCP   12m
kubia        ClusterIP   10.68.253.97   <none>        80/TCP    3m26s

从内部网络访问Service,执行 curl http://10.68.253.97
执行多次会看到,Service会在多个pod中轮训发送请求

[root@localhost ~]# curl http://10.68.253.97
You've hit kubia-xk9nd
[root@localhost ~]# curl http://10.68.253.97
You've hit kubia-p4s8w
[root@localhost ~]# curl http://10.68.253.97
You've hit kubia-xk9nd
[root@localhost ~]# curl http://10.68.253.97
You've hit kubia-hm4fl
Endpoints

endpoint是在Service和pod之间的一种资源

一个endpoint资源,包含一组pod的地址列表

**Endpoints**查看 k get ep

service描述信息查看,执行 k describe svc kubia 也有Endpoints

[root@localhost ~]# k describe svc kubia
Name:              kubia
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=kubia
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.68.253.97
IPs:               10.68.253.97
Port:              <unset>  80/TCP
TargetPort:        8080/TCP
Endpoints:         172.20.1.2:8080,172.20.2.2:8080,172.20.2.3:8080
Session Affinity:  None
Events:            <none>

会话亲和性

来自同一个客户端的请求,总是发给同一个pod

cat <<EOF > kubia-svc-clientip.yml
apiVersion: v1
kind: Service
metadata:
  name: kubia-clientip
spec:
  sessionAffinity: ClientIP        # 回话亲和性使用ClientIP
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: kubia
EOF

[root@localhost ~]# k get svc
NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes       ClusterIP   10.68.0.1       <none>        443/TCP   18h
kubia            ClusterIP   10.68.253.97    <none>        80/TCP    18h
kubia-clientip   ClusterIP   10.68.136.118   <none>        80/TCP    75s

# 执行多次会看到,每次请求的都是同一个pod
[root@localhost ~]# curl http://10.68.136.118
You've hit kubia-hm4fl
[root@localhost ~]# curl http://10.68.136.118
You've hit kubia-hm4fl
[root@localhost ~]# curl http://10.68.136.118
You've hit kubia-hm4fl

不含pod选择器的服务,不会创建 endpoint

cat <<EOF > external-service.yml
apiVersion: v1
kind: Service
metadata:
  name: external-service        #  Service命名
spec:
  ports:
  - port: 80
EOF
# 创建没有选择器的 Service,不会创建Endpoint
k create -f external-service.yml

# 查看Service
k get svc

# 通过内部网络ip访问Service,没有Endpoint地址列表,没有任何的转发地址,会拒绝连接
curl http://10.68.56.187

创建endpoint关联到Service,它的名字必须与Service同名

cat <<EOF > external-service-endpoints.yml
apiVersion: v1
kind: Endpoints                 # 资源类型
metadata:
  name: external-service        # 名称要与Service名相匹配
subsets:
- addresses:                    # 包含的地址列表
  - ip: 120.52.99.224           # 中国联通的ip地址
  - ip: 117.136.190.162         # 中国移动的ip地址
  ports:
  - port: 80                    # 目标服务的的端口
EOF
# 创建Endpoint
k create -f external-service-endpoints.yml

在访问 curl http://10.68.56.187 发现会在联通和移动两个地址来回调用

curl集群ip,集群内部的虚拟网络ip,跨服务器的

八、服务暴露给客户端

前面创建的Service只能在集群内部网络中访问,那么怎么让客户端来访问Service呢?
三种方式

  • NodePort
    每个节点都开放一个端口
  • LoadBalance
    NodePort的一种扩展,负载均衡器需要云基础设施来提供
  • Ingress

NodePort
在每个节点(包括master),都开放一个相同的端口,可以通过任意节点的端口来访问Service

cat <<EOF > kubia-svc-nodeport.yml
apiVersion: v1
kind: Service
metadata:
  name: kubia-nodeport
spec:
  type: NodePort           # 在每个节点上开放访问端口
  ports:
  - port: 80               # 集群内部访问该服务的端口
    targetPort: 8080       # 容器的端口
    nodePort: 30123        # 外部访问端口
  selector:
    app: kubia
EOF

可以通过任意节点的30123端口来访问 Service
http://192.168.64.191:30123
http://192.168.64.192:30123
http://192.168.64.193:30123

进入容器访问service,可以用service的名字直接调用,只有容器内部提供IP的解析环境,

[root@localhost ~]# kubectl exec -it kubia-hm4fl bash
root@kubia-hm4fl:/# curl http://kubia
You've hit kubia-xk9nd
root@kubia-hm4fl:/# curl http://kubia-clientip
You've hit kubia-p4s8w
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!要在Kubernetes上部署仪表板Dashboard,您可以按照以下步骤进行操作: 1. 首先,确保您已经安装了Kubernetes集群,并且具有对集群的管理权限。 2. 在部署仪表盘之前,需要创建一个用于访问仪表盘的服务账户。创建一个文件 `dashboard-admin.yaml`,并将以下内容复制到文件中: ```yaml apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kubernetes-dashboard ``` 保存并应用该配置文件: ``` $ kubectl apply -f dashboard-admin.yaml ``` 3. 接下来,我们需要为服务账户分配集群角色和角色绑定。创建一个文件 `dashboard-access.yaml`,并将以下内容复制到文件中: ```yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kubernetes-dashboard ``` 保存并应用该配置文件: ``` $ kubectl apply -f dashboard-access.yaml ``` 4. 现在,我们可以部署仪表盘。执行以下命令: ``` $ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml ``` 5. 部署完成后,可以使用以下命令创建一个代理,以便通过本地主机访问仪表盘: ``` $ kubectl proxy ``` 6. 打开浏览器并访问 `http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/`,您将能够访问Kubernetes仪表盘。 请注意,这是一个简单的步骤,用于在Kubernetes上部署仪表盘。为了安全起见,在生产环境中,您可能需要进行更多的配置和授权。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值