k8s基本概念-如何使用Services

k8s基本概念-如何使用Services

2018/1/5

Services 使用示例

  • Virtual IPs and service proxies
  • Publishing services - service types
  • 通过命令行来控制 Service
  • 通过 yaml 配置文件来定义 Service
Virtual IPs and service proxies
  • Proxy-mode: userspace

    • 轮询
  • Proxy-mode: iptables
    • v1.2开始作为默认选项
    • 比 userspace 快
    • 注意:如果一开始选择的 pod 失去响应后,不能自动重试其他 pod 因而需要定义 readiness probes
    • 随机
  • Proxy-mode: ipvs
    • FEATURE STATE: Kubernetes v1.9 beta
    • 比 iptables 快
Publishing services - service types
  • ClusterIP

    • 创建一个 ClusterIP 来提供集群内部访问
    • 默认选项
  • NodePort
    • 在每个节点 IP 上暴露一个端口(NodePort)来提供服务,集群外部通过这种方式来访问:<NodeIP>:<NodePort>,同时会创建一个 ClusterIP
    • 这种类型使用较多
    • 默认暴露的随机端口范围:30000-32767
    • 可以通过 nodePort 字段来显式的指定端口
  • LoadBalancer
    • 通过和 cloud provider’s load balancer 关联使用,此时 NodePort and ClusterIP 将自动创建
  • ExternalName
    • 将 service 名称映射到一个 externalName (例如一个域名),通过 kube-dns 来提供 DNS 到 CNAME 记录
通过命令行来控制 Service
  • 获取和创建 service

    
    ### 获取所有的 service 列表:
    [[email protected] ~]# kubectl get services
    NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
    kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   5d

创建一个网络类型为 NodePort 的 service 并暴露 pods 的 80 端口

[[email protected] ~]# kubectl expose deployments/test-deployment-app-whoami --type="NodePort" --port 80
service "test-deployment-app-whoami" exposed

再次获取所有的 service 列表:

[[email protected] ~]# kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d
test-deployment-app-whoami NodePort 10.108.8.154 <none> 80:31816/TCP 9s

当然,也可以通过 label 来筛选:

[[email protected] ~]# kubectl get services -l app=whoami
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
test-deployment-app-whoami NodePort 10.108.8.154 <none> 80:31816/TCP 23s


- 查看细节
```bash
### 查看 service 的细节:
[[email protected] ~]# kubectl describe services/test-deployment-app-whoami
Name:                     test-deployment-app-whoami
Namespace:                default
Labels:                   app=whoami
Annotations:              <none>
Selector:                 app=whoami
Type:                     NodePort
IP:                       10.108.8.154
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  31816/TCP
Endpoints:                172.30.11.74:80,172.30.11.75:80,172.30.11.77:80 + 2 more...
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

### 此处也可以通过 label 来筛选
[[email protected] ~]# kubectl describe services -l app=whoami
Name:                     test-deployment-app-whoami
Namespace:                default
Labels:                   app=whoami
Annotations:              <none>
Selector:                 app=whoami
Type:                     NodePort
IP:                       10.108.8.154
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  31816/TCP
Endpoints:                172.30.11.74:80,172.30.11.75:80,172.30.11.77:80 + 2 more...
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>
  • 请求 service

    
    [[email protected] ~]# export NODE_PORT=$(kubectl get services/test-deployment-app-whoami -o go-template=‘{{(index .spec.ports 0).nodePort}}‘)
    [[email protected] ~]# echo NODE_PORT=$NODE_PORT
    NODE_PORT=31816

[[email protected] ~]# kubectl get pods -l app=whoami
NAME READY STATUS RESTARTS AGE
test-deployment-app-whoami-6cf9cd6bf4-2dd5m 1/1 Running 0 15h
test-deployment-app-whoami-6cf9cd6bf4-bb7v7 1/1 Running 0 15h
test-deployment-app-whoami-6cf9cd6bf4-c7cht 1/1 Running 0 15h
test-deployment-app-whoami-6cf9cd6bf4-jhtqz 1/1 Running 0 15h
test-deployment-app-whoami-6cf9cd6bf4-px24h 1/1 Running 0 15h

测试请求 10 次的结果:

[[email protected] ~]# for i in $(seq 1 10); do curl -s tvm-00:$NODE_PORT|grep Hostname; done
Hostname: test-deployment-app-whoami-6cf9cd6bf4-jhtqz
Hostname: test-deployment-app-whoami-6cf9cd6bf4-bb7v7
Hostname: test-deployment-app-whoami-6cf9cd6bf4-px24h
Hostname: test-deployment-app-whoami-6cf9cd6bf4-jhtqz
Hostname: test-deployment-app-whoami-6cf9cd6bf4-2dd5m
Hostname: test-deployment-app-whoami-6cf9cd6bf4-c7cht
Hostname: test-deployment-app-whoami-6cf9cd6bf4-c7cht
Hostname: test-deployment-app-whoami-6cf9cd6bf4-bb7v7
Hostname: test-deployment-app-whoami-6cf9cd6bf4-jhtqz
Hostname: test-deployment-app-whoami-6cf9cd6bf4-px24h

符合预期,请求随机分布在 5 个 pods 上


- 删除 service
```bash
[[email protected] ~]# kubectl delete services -l app=whoami
service "test-deployment-app-whoami" deleted
[[email protected] ~]# kubectl get services
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   5d
通过 yaml 配置文件来定义 Service
  • 创建配置文件

    
    [[email protected] ~]# cat ~/k8s_install/test/whoami/app.yaml
    apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
    kind: Deployment
    metadata:
    name: app-whoami
    labels:
    app: whoami
    spec:
    replicas: 3
    selector:
    matchLabels:
      app: whoami
    template:
    metadata:
      labels:
        app: whoami
    spec:
      containers:
        - name: whoami
          image: opera443399/whoami:0.9
          ports:
            - containerPort: 80


apiVersion: v1
kind: Service
metadata:
name: svc-whoami
labels:
app: whoami
spec:
selector:
app: whoami
ports:

  • protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30080
    type: NodePort

- 执行
```bash
[[email protected] ~]# kubectl apply -f whoami/app.yaml --record
deployment "app-whoami" created
service "svc-whoami" created
  • 获取信息

    
    [[email protected] ~]# kubectl get all -l app=whoami
    NAME                DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    deploy/app-whoami   3         3         3            3           25s

NAME DESIRED CURRENT READY AGE
rs/app-whoami-6cf9cd6bf4 3 3 3 25s

NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deploy/app-whoami 3 3 3 3 25s

NAME DESIRED CURRENT READY AGE
rs/app-whoami-6cf9cd6bf4 3 3 3 25s

NAME READY STATUS RESTARTS AGE
po/app-whoami-6cf9cd6bf4-2pxlh 1/1 Running 0 25s
po/app-whoami-6cf9cd6bf4-82ng2 1/1 Running 0 25s
po/app-whoami-6cf9cd6bf4-msbmk 1/1 Running 0 25s

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
svc/svc-whoami NodePort 10.96.100.22 <none> 80:30080/TCP 25s


- 测试
```bash
[[email protected] ~]# curl -s 10.96.100.22:80 |grep Hostname
Hostname: app-whoami-6cf9cd6bf4-msbmk
[[email protected] ~]# curl -s tvm-00:30080 |grep Hostname
Hostname: app-whoami-6cf9cd6bf4-2pxlh
[[email protected] ~]# curl -s tvm-01:30080 |grep Hostname
Hostname: app-whoami-6cf9cd6bf4-2pxlh
[[email protected] ~]# curl -s tvm-02:30080 |grep Hostname
Hostname: app-whoami-6cf9cd6bf4-msbmk

原文地址:http://blog.51cto.com/nosmoking/2062903

时间: 2024-10-02 00:00:09

k8s基本概念-如何使用Services的相关文章

kubernetes(k8s) 基础概念

K8S基础概念 1.Node Node作为集群中的工作节点,运行真正的应用程序,在Node上Kubernetes管理的最小运行单元是Pod.Node上运行着Kubernetes的Kubelet.kube-proxy服务进程,这些服务进程负责Pod的创建.启动.监控.重启.销毁.以及实现软件模式的负载均衡. Node包含的信息: Node地址:主机的IP地址,或Node ID. Node的运行状态:Pending.Running.Terminated三种状态. Node Condition:- N

k8s基本概念-如何使用Deployments

k8s基本概念-如何使用Deployments 2018/1/5 Deployments 使用示例 创建一个 app 查看 app 状态 更新 app 回滚 app 扩缩容 app 删除 app 创建一个 app 通过 yaml 配置文件来定义 Deployment 关于 apiVersion 的写法,请参考: https://github.com/kubernetes/kubernetes/blob/630dbedef9de9ef678f16132796b103b8a03fcda/pkg/ap

k8s基本概念-配置调度策略之(Taints-and-Tolerations)

k8s基本概念-配置调度策略之(Taints-and-Tolerations) 2018/4/12 通过定义 Taints and Tolerations 来达到 node 排斥 pod 的目的 通过一个典型实例来描述 taint 和 toleration 之间的关联 测试前的集群状态 部署app whoami-t1 测试 taint 的用法 测试结果 测试使用 toleration 测试结果 如何移除指定的 taint 呢? 聊一聊 Taints and Tolerations 的细节 概念

k8s学习 - 概念 - Pod

k8s学习 - 概念 - Pod 这篇继续看概念,主要是 Pod 这个概念,这个概念非常重要,是 k8s 集群的最小单位. 怎么才算是理解好 pod 了呢,基本上把 pod 的所有 describe 和配置文件的配置项都能看懂就算是对 pod 比较了解了. Pod 我们通过调用一个kubectl describe pod xxx 可以查看某个 pod 的具体信息. describe 的信息我们用注释的形式来解读. Name: task-pv-pod Namespace: default // 没

k8s学习 - 概念 - ReplicaSet

k8s学习 - 概念 - ReplicaSet 首先,ReplicaSet 和 ReplicationController 基本上一样,除了上篇说到的selector有不同之外,没有啥区别.(官网也是这么说的).但是为什么官方建议的不是ReplicaController + Deployment的集合呢?咋们也不敢说,咋们也不敢问.反正我就知道,用 ReplicationController 的值得被鄙视,用ReplicationSet +deployment 的现在是正统. ReplicaSe

k8s学习 - 概念 - Deployment

k8s学习 - 概念 - Deployment 有了 ReplicaSet 还需要有 Deployment 的原因是希望有一个控制器能管理部署更新时候的版本控制问题.一个 Deployment 可以管理多个 ReplicaSet, 一个 ReplicaSet 可以管理多个 Pod.最通用的场景是当我们对某个 Pod 里面的镜像进行升级的时候,我们非常迫切需要有一个版本号概念,并且在发现问题的时候可以随时回滚.那么这个就是 Deployment 的使命. 使用 官方和很多文章都是使用 nginx

k8s基本概念

一.k8s基本概念 k8s大部分概念比如Node,Pod.RC,service等都可以看做一种资源对象,几乎所有的资源对象都可以通过k8s提供的kubectl工具执行增,删,改,查等操作并将其保存在etcd中持久化存储. 二.master master指的是集群控制节点,来负责整个集群的管理和控制,基本上k8s的所有控制命令都是发给它.我们后面执行的命令基本都是在master节点上运行的.通常它会占据一个独立的x86服务器(或一个虚拟机). master节点上运行一些关键进程: k8s API

ASP.NET Core on K8S学习初探(2)K8S基本概念快速一览

在上一篇<单节点环境搭建>中,通过Docker for Windows在Windows开发机中搭建了一个单节点的K8S环境,接下来就是动人心弦的部署ASP.NET Core API到K8S了.但是,在部署之前,我还是把基本的一些概念快速地简单地不求甚解地过一下. 一.K8S集群基本概念 (1)集群 首先,K8S集群也是需要多台服务器组成,作为容器的编排管理平台,只有一个节点在生产环境是不够的. (2)Node 其次,Node作为K8S集群中的工作节点,一个Node可以是VM或物理机,它运行真正

k8s 重要概念 - 每天5分钟玩转 Docker 容器技术(117)

在实践之前,必须先学习 Kubernetes 的几个重要概念,它们是组成 Kubernetes 集群的基石. Cluster Cluster 是计算.存储和网络资源的集合,Kubernetes 利用这些资源运行各种基于容器的应用. Master Master 是 Cluster 的大脑,它的主要职责是调度,即决定将应用放在哪里运行.Master 运行 Linux 操作系统,可以是物理机或者虚拟机.为了实现高可用,可以运行多个 Master. Node Node 的职责是运行容器应用.Node 由