前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >07 . Kubernetes之Service

07 . Kubernetes之Service

作者头像
iginkgo18
修改2021-05-14 15:17:32
5130
修改2021-05-14 15:17:32
举报
文章被收录于专栏:devops_k8sdevops_k8s
kubernetes有三种网络
代码语言:javascript
复制
1. Node Network
2. Pod Network
3. Cluster Network
Service-网络代理模式

**userspce: 1.1-

**三种代理模式 1.1版本使用的userspace,性能低,因为用户请求先要到内核空间,然后到主机用户空间Kube-Proxy,由kube-proxy封装报文再返回到内核空间,再到iptables分发.

2.iptables 1.10版本就开始使用iptables,因为他直接工作在内核,性能相比之前提升了很多,他是基于四层的转发,不会经过用户层kube-proxy,直接调度给相关的Pod

3.ipvs 1.11版本默认ipvs,如果没激活降级为iptables 1.8版本增加了ipvs为了能最大的发挥转发的性能,client请求到达了直接调度给Pod网络地址范围.

Service类型

类型

代码语言:javascript
复制
ExternalName: # 把集群外部服务引入到集群内部直接使用
ClusterIP: # 默认,仅用于集群内部通信,如果要接入外部需要NodePort;
NodePort:
LoadBalancer:  # 表示我们把kubernetes集群部署在虚拟机上,虚拟机工作在云环境上,云环境支持LBAAS,负载均衡一键调用.

资源记录 SVC_NAME,NS_NAME,DOMAIN,LTD svc.cluster.local redis.default.svc.cluster.local

Example1.使用清单创建SVC

代码语言:javascript
复制
cat pod-service.yaml 
apiVersion: v1
kind: Service
metadata:
  name: redis
  namespace: default
spec:
  selector:
    app: myapp
    release: canary
  clusterIP: 10.96.122.10 
  type: NodePort 
  ports:
  - port: 80
    targetPort: 80 
    nodePort: 30000

cat pod-deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deploy
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
      release: canary
  template:
    metadata:
      labels:
        app: myapp
        release: canary
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v1
        ports:
        - name: http
          containerPort: 80
kubectl describe svc redis
kubectl get endpoints

使用集群外的机器访问看下什么效果

代码语言:javascript
复制
while true; do curl 172.19.0.26:30000/hostname.html ; sleep 2;done
myapp-deploy-7d574d56c7-2tsdx
myapp-deploy-7d574d56c7-hcw8s
myapp-deploy-7d574d56c7-hcw8s
myapp-deploy-7d574d56c7-hcw8s
myapp-deploy-7d574d56c7-2tsdx


kubectl patch svc redis -p '{"spec":{"sessionAffinity":"ClientIP"}}'	
# sessionAffinity,让同一个客户端IP访问固定的一个Pod
myapp-deploy-7d574d56c7-hcw8s
myapp-deploy-7d574d56c7-hcw8s
myapp-deploy-7d574d56c7-hcw8s
myapp-deploy-7d574d56c7-hcw8s
myapp-deploy-7d574d56c7-hcw8s
myapp-deploy-7d574d56c7-hcw8s
myapp-deploy-7d574d56c7-hcw8s

kubectl patch svc redis -p '{"spec":{"sessionAffinity":"None"}}'
# 修改成默认值None
myapp-deploy-7d574d56c7-2tsdx
myapp-deploy-7d574d56c7-2tsdx
myapp-deploy-7d574d56c7-hcw8s
myapp-deploy-7d574d56c7-2tsdx
myapp-deploy-7d574d56c7-2tsdx
myapp-deploy-7d574d56c7-hcw8s

# Service到Pod是有一个中间层,Endpoints,他也是一个标准Kubernetes对象,地址加端口,关联到后端的Pod

创建一个无头IP

代码语言:javascript
复制
cat pod-svc-head.yaml 
apiVersion: v1
kind: Service
metadata:
  name: myapp-svc
  namespace: default
spec:
  selector:
    app: myapp
    release: canary
  clusterIP: "None"
  ports:
  - port: 80
    targetPort: 80

kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        5d17h
myapp-svc    ClusterIP   None           <none>        80/TCP         8m16s
使用清单定义Service服务代理

Example

代码语言:javascript
复制
cat service.yaml 
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80
  - name: https
    protocol: TCP
    port: 443
    targetPort: 443 
# 通过svc的ClusterIP地址加上端口就能访问此处app指定的服务

kubectl get svc  
NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE  
kubernetes      ClusterIP   10.96.0.1      <none>        443/TCP          29h  
my-service      ClusterIP   10.96.87.66    <none>        80/TCP,443/TCP   61s


kubectl get endpoints my-service
NAME         ENDPOINTS   AGE
my-service   <none>      3m25s

因为匹配不到MyApp标签的Pod,我们去修改下my-service里面标签为已有Pod的标签

代码语言:javascript
复制
kubectl edit svc/my-service
28   selector:
29     app: nginx
30   sessionAffinity: None
31   type: ClusterIP

# 然后我们去查看service后面有不有代理的Pod
kubectl get ep
kubectl get ep
NAME            ENDPOINTS                                                  AGE
kubernetes      192.168.78.7:6443                                          29h
my-service      10.244.2.11:80,10.244.3.13:80,10.244.3.14:80 + 3 more...   6m37s
nginx-service   <none>   

# 接下来访问svc里面的IP+端口即可
服务发现(环境变量与KubeDNS)

环境变量

当一个Pod运行在Node,kubelet会为每个容器添加一组环境变量,Pod容器中程序就可以使用这些环境变量发现Service。这些环境变量格式如下:

代码语言:javascript
复制
(SVCNAME)_SERVICE_HOST
(SVCNAME)_SERVICE_PORT
其中服务名和端口名转为大写,连字符转换为下划线.

限制

代码语言:javascript
复制
# 1. Pod和Service的创建顺序是由要求的,Service必须在Pod创建之前被创建,否则环境变量不会设置到Pod上.
# 2. Pod只能获取同个NameSpace中的Service环境变量.

DNS

DNS服务监视Kubernetes API,为每一个Service创建DNS记录用于域名解析,这样Pod中可以通过DNS域名获取Service的访问地址.

Example1 我们先创建一个busybox的pod

代码语言:javascript
复制
 cat busybox.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: default
spec:
  containers:
  - image: busybox
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
    name: busybox
  restartPolicy: Always

kubectl exec -it busybox /bin/sh
/ # env |head -6
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT=443
MY_SERVICE_PORT_443_TCP_ADDR=10.96.87.66
MY_SERVICE_PORT_80_TCP=tcp://10.96.87.66:80
HOSTNAME=busybox
SHLVL=1
# 我们每创建一个Pod都会在env里面创建这些环境变量
[root@master ~]# kubectl get svc
NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
kubernetes      ClusterIP   10.96.0.1      <none>        443/TCP          29h
my-service      ClusterIP   10.96.87.66    <none>        80/TCP,443/TCP   22m
nginx-service   ClusterIP   10.96.60.189   <none>        8080/TCP         24m
[root@master ~]# kubectl exec -it busybox /bin/sh
/ # echo ${MY_SERVICE_SERVICE_HOST_PORT}
10.96.87.66
# 我们可以通过一些变量获取相应的值
# 但是我们要先创建service,后面的Pod才能获取service那些环境变量.

Example2(DNS) DNS可以抛去上面的那种Pod先后创建顺序限制 https://github.com/kelseyhightower/kubernetes-the-hard-way/blob/master/deployments/kube-dns.yaml

代码语言:javascript
复制
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-05-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • kubernetes有三种网络
  • Service-网络代理模式
  • Service类型
  • 使用清单定义Service服务代理
  • 服务发现(环境变量与KubeDNS)
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档