K8S实践Ⅳ(Service)

一、Service概念

通过创建service可以为一组具有相同功能的容器应用提供一个统一的入口地址,并将请求负载分发到后端的各个容器应用上。

二、Service基本用法

1.定义一个web服务的RC,由两个tomcat容器副本组成

# cat webapp-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: webapp
spec:
  replicas: 2
  template:
    metadata:
      name: webapp
      labels:
        app: webapp
    spec:
      containers:
      - name: webapp
        image: tomcat
        ports:
        - containerPort: 8080

2.创建该RC

# kubectl get pod
NAME           READY   STATUS    RESTARTS   AGE
webapp-t5q4g   1/1     Running   0          17m
webapp-wq88m   1/1     Running   0          17m
# kubectl get pods -l app=webapp -o yaml | grep  podIP
    podIP: 10.44.0.2
    podIP: 10.36.0.1

3.使用kubectl expose创建一个SVC

# kubectl expose rc webapp
service/webapp exposed
# kubectl get svc
webapp       ClusterIP   10.111.192.152   <none>        8080/TCP   8s

4.通过svc地址和端口访问

# curl 10.111.192.152:8080

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <title>Apache Tomcat/8.5.42</title>
......

对svc地址10.111.192.152:8080的访问被自动负载分发到了后端的两个Pod之一10.44.0.2:8080或10.36.0.1:8080。
kubernets提供了两种负载分发策略:RoundRobin和SessionAffinity,默认情况下采用的是RoundRobin模式进行负载。

  • RoundRobin:轮询模式
  • SessionAffinity:粘性会话,将来自同一个客户端的请求始终转发至同一个后端的Pod对象,可以通过设置service.spec.sessionAffinity: ClientIP来启用

5.使用配置文件方式创建svc

apiVersion: v1
kind: Service
metadata:
  name: webapp
spec:
  type: ClusterIP
  ports:
  - port: 8081
    targetPort: 8080
  selector:
    app: webapp

ports:与后端容器端口关联
selector:关联到哪些pod资源上

# kubectl delete svc webapp
service "webapp" deleted
# kubectl create -f webapp-svc.yaml
service/webapp created
# kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
webapp       ClusterIP   10.96.231.61     <none>        8081/TCP   14s

6.多端口Service创建

apiVersion: v1
kind: Service
metadata:
  name: webapp
spec:
  ports:
  - port: 8080
    targetPort: 8080
    name: web
  - port: 8005
    targetPort: 8005
    name: management
  selector:
    app: webapp

7.使用UDP端口模式

apiVersion: v1
kind: Service
metadata:
  name: kube-dns
  namespace: kube-system
  labels:
    k8s-app: kube-dns
    kubernetes.io/cluster-service: "true"
    kubernetes.io/name: "KubeDNS"
spec:
  selector:
    k8s-app: kube-dns
  clusterIP: 169.169.0.100
  ports:
  - name: dns
    port: 53
    protocol: UDP
  - name: dns-tcp
    port: 53
    protocol: TCP

8.外部服务Service

在一些环境中,应用系统需要将一个外部数据库作为后端服务进行连接,这时可以通过创建一个没有Selector的svc来实现

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

由于这个 Service 没有 selector,就不会创建相关的 Endpoints 对象。可以手动将 Service 映射到指定的 Endpoints:

kind: Endpoints
apiVersion: v1
metadata:
  name: my-service
subsets:
- addresses:
  - IP: 1.2.3.4
  ports:
  - port: 80

三、Headless Service

有时不需要或不想要负载均衡,以及单独的 Service IP。 遇到这种情况,可以通过指定 Cluster IP(spec.clusterIP)的值为 "None" 来创建Headless Service,仅通过Selector将后端的Pod列表返回给调用的客户端

创建一个Headless Service实例

apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  ports:
  - port: 80
  clusterIP: None
  selector:
    app: nginx
# kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
nginx        ClusterIP   None         <none>        80/TCP    26s

四、从集群外部访问Pod或Service

1.将容器应用的端口映射到物理机

# cat pod-hostport.yaml
apiVersion: v1
kind: Pod
metadata:
  name: webapp
  labels:
    app: webapp
spec:
  containers:
  - name: webapp
    image: tomcat
    ports:
    - containerPort: 8080
      hostPort: 8081

此处映射的IP地址为该Pod所在node的IP

# curl 20.0.20.103:8081

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <title>Apache Tomcat/8.5.42</title>
        <link href="favicon.ico" rel="icon" type="image/x-icon" />
        <link href="favicon.ico" rel="shortcut icon" type="image/x-icon" />

通过设置spce.hostNetwork=true,默认hostPort等于containerPort

apiVersion: v1
kind: Pod
metadata:
  name: webapp
  labels:
    app: webapp
spec:
  hostNetwork: true
  containers:
  - name: webapp
    image: tomcat
    ports:
    - containerPort: 8080

2.将Service的端口映射到物理机

# cat webapp-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: webapp
spec:
  replicas: 2
  template:
    metadata:
      name: webapp
      labels:
        app: webapp
    spec:
      containers:
      - name: webapp
        image: tomcat
        ports:
        - containerPort: 8080
# cat webapp-svcnodeport.yaml
apiVersion: v1
kind: Service
metadata:
  name: webapp
spec:
  type: NodePort
  ports:
  - port: 8080
    targetPort: 8080
    nodePort: 30011
  selector:
    app: webapp
# curl 20.0.20.101:30011

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <title>Apache Tomcat/8.5.42</title>
        <link href="favicon.ico" rel="icon" type="image/x-icon" />
        <link href="favicon.ico" rel="shortcut icon" type="image/x-icon" />

原文地址:https://blog.51cto.com/lullaby/2413434

时间: 2024-08-29 22:58:52

K8S实践Ⅳ(Service)的相关文章

k8s实践(四):Controller

环境说明: 主机名 操作系统版本 ip docker version kubelet version 配置 备注 master Centos 7.6.1810 172.27.9.131 Docker 18.09.6 V1.14.2 2C2G 备注 node01 Centos 7.6.1810 172.27.9.135 Docker 18.09.6 V1.14.2 2C2G 备注 node02 Centos 7.6.1810 172.27.9.136 Docker 18.09.6 V1.14.2

k8s实践(七):存储卷和数据持久化(Volumes and Persistent Storage)

环境说明: 主机名 操作系统版本 ip docker version kubelet version 配置 备注 master Centos 7.6.1810 172.27.9.131 Docker 18.09.6 V1.14.2 2C2G master主机 node01 Centos 7.6.1810 172.27.9.135 Docker 18.09.6 V1.14.2 2C2G node节点 node02 Centos 7.6.1810 172.27.9.136 Docker 18.09.

k8s实践(九):Helm and Kubeapps UI

环境说明: 主机名 操作系统版本 ip docker version kubelet version helm version 配置 备注 master Centos 7.6.1810 172.27.9.131 Docker 18.09.6 V1.14.2 v2.14.3 2C2G master主机 node01 Centos 7.6.1810 172.27.9.135 Docker 18.09.6 V1.14.2 v2.14.3 2C2G node节点 node02 Centos 7.6.18

k8s实践(八):ConfigMap and Secret

环境说明: 主机名 操作系统版本 ip docker version kubelet version 配置 备注 master Centos 7.6.1810 172.27.9.131 Docker 18.09.6 V1.14.2 2C2G master主机 node01 Centos 7.6.1810 172.27.9.135 Docker 18.09.6 V1.14.2 2C2G node节点 node02 Centos 7.6.1810 172.27.9.136 Docker 18.09.

k8s实践(二):基本概念、kubectl命令和资料分享

概念 1. Kubernetes简介 Kubernetes是谷歌开源的容器集群管理系统,是Google多年大规模容器管理技术Borg的开源版本,主要功能包括: 基于容器的应用部署.维护和滚动升级 负载均衡和服务发现 跨机器和跨地区的集群调度 自动伸缩 无状态服务和有状态服务 广泛的 Volume 支持 插件机制保证扩展性 Kubernetes 发展非常迅速,已经成为容器编排领域的领导者. 2. Kubernetes核心组件 Kubernetes 主要由以下几个核心组件组成: etcd 保存了整个

K8s 实践 | 如何解决多租户集群的安全隔离问题?

作者 |?匡大虎? 阿里巴巴技术专家 导读:如何解决多租户集群的安全隔离问题是企业上云的一个关键问题,本文主要介绍 Kubernetes 多租户集群的基本概念和常见应用形态,以及在企业内部共享集群的业务场景下,基于 Kubernetes 原生和 ACK 集群现有安全管理能力快速实现多租户集群的相关方案. 什么是多租户集群? 这里首先介绍一下"租户",租户的概念不止局限于集群的用户,它可以包含为一组计算,网络,存储等资源组成的工作负载集合.而在多租户集群中,需要在一个集群范围内(未来可能

k8s实践

内网中k8s的相关配置 kubernetes是以pod而不是docker容器为管理单元的,在k8s创建pod时,还会通过 启动一个名为 google_container/pause的镜像来实现pod的概念,该镜像文件存在谷歌镜像库http://gcr.io中,需要一台能上internet的服务器将其下载并导出,push到私有docker registry中 修改每台node的kubelet服务的启动参数,加上 --pod_infra_container_images参数,指定为私有docker

k8s通过service访问pod(五)--技术流ken

service 每个 Pod 都有自己的 IP 地址.当 controller 用新 Pod 替代发生故障的 Pod 时,新 Pod 会分配到新的 IP 地址.这样就产生了一个问题: 如果一组 Pod 对外提供服务(比如 HTTP),它们的 IP 很有可能发生变化,那么客户端如何找到并访问这个服务呢? Kubernetes 给出的解决方案是 Service. 创建 Service Kubernetes Service 从逻辑上代表了一组 Pod,具体是哪些 Pod 则是由 label 来挑选.S

k8s实践4:kube-proxy问题iptables转发规则不显示

1.今天想看看kube-proxy的iptables转发规则,执行命令iptables-save,见下: [root@k8s-master1 test]# iptables-save |grep "^-A KUBE" -A KUBE-FIREWALL -m comment --comment "kubernetes firewall for dropping marked packets" -m mark --mark 0x8000/0x8000 -j DROP -