前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >K8S原来如此简单(四)Service+Ingress

K8S原来如此简单(四)Service+Ingress

作者头像
Chester Chen
修改2022-08-18 15:14:56
3470
修改2022-08-18 15:14:56
举报
文章被收录于专栏:chester技术分享chester技术分享

上一篇我们通过deployment实现了pod的横向扩展,但是仍然不能负载,也不能对外提供服务,现在我们来看看如何通过k8s实现负载与外网访问

Service

service为一组pod提供一个统一的入口,实现负载,也可实现外部访问。

原理

在Kubernetes集群的每个Node上都会运行一个kube-proxy服务进程,kube-proxy会通过我们定义的service,自动生成iptables规则,这样就能将到某个Service的访问请求转发到后端的多个Pod实例上。

Service类型

ClusterIP

通过集群的内部 IP 暴露服务,选择该模式时服务只能够在集群内部访问。 这也是默认的 ServiceType。

NodePort

通过每个节点上的 IP 和静态端口(NodePort)暴露服务。NodePort 服务会路由到自动创建的 ClusterIP 服务。 通过请求 <节点 IP>:<节点端口>,你可以从集群的外部访问一个 NodePort 服务。

LoadBalancer

使用云提供商的负载均衡器向外部暴露服务。 外部负载均衡器可以将流量路由到自动创建的 NodePort 服务和 ClusterIP 服务上。

Service的Cluster IP与NodePort等概念是kube-proxy服务通过iptables 的NAT转换实现的,kube-proxy在运行过程中动态创建与Service相关的 iptables规则,这些规则实现了将访问服务(Cluster IP或NodePort)的请 求负载分发到后端Pod的功能。

代码语言:javascript
复制


kubeadm方式修改ipvs模式:

kubectl edit configmap kube-proxy -n kube-system

...
mode: “ipvs“
...

定义Service

创建一个ClusterIP的service

代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  name: chesterservice
  namespace: chesterns
spec:
  selector:
    app: chesterapi
  ports:
    - protocol: TCP
      port: 5000
      targetPort: 5000

部署service,并通过service访问oneapi

代码语言:javascript
复制
kubectl apply -f service.yaml
kubectl get service -n chesterns
kubectl describe service chesterservice -n chesterns
curl clusterip:5000/test

clusterip模式的service不能通过外网访问,我们来定义一个nodeport模式的service,实现外部访问

代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  name: chesterservice
  namespace: chesterns
spec:
  type: NodePort
  selector:
    app: chesterapi
  ports:
    - protocol: TCP
      port: 5000
      targetPort: 5000
      nodePort: 30111
代码语言:javascript
复制
kubectl delete -f service.yaml
kubectl apply -f service.yaml
kubectl get service -n chesterns
kubectl describe service chesterservice -n chesterns
curl 192.168.43.111:30111/test
服务发现

k8s通过两种方式实现服务的发现

环境变量

当 Pod 运行在 Node 上,kubelet 会为每个活跃的 Service 添加一组环境变量

{SVCNAME}_SERVICE_HOST

{SVCNAME}_SERVICE_PORT

通过以下命令即可看到

代码语言:javascript
复制
kubectl get pod -n chesterns
kubectl exec chesterdeployment-6d89bc6b45-c5vbv  -n chesterns -- env
代码语言:javascript
复制
DNS

CoreDNS 是一种灵活的,可扩展的 DNS 服务器,可以 安装为集群内的 Pod 提供 DNS 服务。

ClusterIP A记录格式:

<service-name>.<namespace-name>.svc.cluster.local

示例:

my-svc.my-namespace.svc.cluster.local

Ingress

NodePort存在端口不足,只支持4层负载(IP:Port)不支持7层网络负载的缺点。Ingress为了弥补这些缺点而生。

对于基于HTTP的服务来说,不同的URL地址经常对应到不同的后端服务或者虚拟服务器(Virtual Host),这些应用层的转发机制仅通过Kubernetes的Service机制是无法实现的。

使用Ingress进行负载分发时,Ingress Controller基于Ingress规则将客户端请求直接转发到Service对应的后端Endpoint(Pod)上,这样会跳过kube-proxy的转发功能,kube-proxy不再起作用。如果Ingress Controller提供的是对外服务,则实际上实现的是边缘路由器的功能。

Ingress Nginx

Ingress nginx是我们常用的一种ingress controller,他的原理是监听Ingress资源,把用户定义的Ingress转移成Nginx的配置信息

核心代码如下

安装Ingress Nginx

通过以下链接下载yaml文件:

https://kubernetes.github.io/ingress-nginx/deploy/

创建Ingress Controller

代码语言:javascript
复制
kubectl apply -f nginx-ingress.yaml
kubectl get pods --namespace=ingress-nginx

创建Ingress

代码语言:javascript
复制
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: chesteringress
  namespace: chesterns
  annotations:
   kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: chester.k8s.com
    http:
      paths:
      - pathType: Prefix
        path: "/test"
        backend:
         service:
          name: chesterservice
          port:
           number: 5000

部署

代码语言:javascript
复制
kubectl apply -f ingress.yaml

查看nginx配置信息,判断ingress是否生效

代码语言:javascript
复制
kubectl cp ingress-nginx-controller-58fccdc57c-gzkns:/etc/nginx/nginx.conf /tmp/nginx.conf -n ingress-nginx
cat /tmp/nginx.conf


配置hosts
代码语言:javascript
复制
kubectl get pods --namespace=ingress-nginx -o wide

vi /etc/hosts
(ingress-nginx-controller的集群ip) chester.k8s.com

测试访问

代码语言:javascript
复制
curl chester.k8s.com/test/

为Ingress配置https

配置HTTPS步骤:

  1. 准备域名证书文件(来自:openssl/cfssl工具自签或者权威机构颁发)
  2. 将证书文件保存到Secret
代码语言:javascript
复制
kubectl create secret tls chestertlssecret -- cert=chester.k8s.com.pem --key=chester.k8s.com-key.pem

  1. Ingress规则配置tls
代码语言:javascript
复制
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
 name: chesteringress
spec:
 tls:
 - hosts:
   - chester.k8s.com
   secretName: chestertlssecret
 rules:
 - host: chester.k8s.com
   http:
    paths:
    - path: /
      pathType: Prefix
      backend:
       service:
        name: web
        port:
         number: 80
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-03-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 chester技术分享 微信公众号,前往查看

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

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

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