您的位置:

k8ssvc——kubernetes service的使用详解

一、k8ssvc网络模式

1、ClusterIP模式

ClusterIP模式是k8ssvc最常用的网络模式,它可以将一组Pod通过一个虚拟的ClusterIP暴露出来,用户只需要访问该ClusterIP就可以访问到整个Pod组,该模式适用于内部服务之间的调用以及对外暴露服务的场景。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - name: http
      port: 80
      targetPort: http

以上代码演示了ClusterIP模式的使用,其中name为该Service的名称,selector为该Service所关联的Pod的标识符,ports为该Service暴露出来的端口号及对应的Pod端口号。

2、NodePort模式

NodePort模式是k8ssvc将Pod暴露给集群外部的一种方式,相当于在每个Node上开放一个端口,但通常会结合LoadBalancer进行使用,用于将集群外部的请求转发到NodePort上,由NodePort再转发到Pod。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - name: http
      port: 80
      targetPort: http
  type: NodePort

以上代码演示了NodePort模式的使用,其中type为该Service的类型,指定为NodePort即可使用该模式。

3、LoadBalancer模式

LoadBalancer模式是在NodePort模式的基础上增加了一层负载均衡,能够将NodePort上的请求进行负载均衡分发到多个Pod上,相比NodePort模式更具有扩展性。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - name: http
      port: 80
      targetPort: http
  type: LoadBalancer

以上代码演示了LoadBalancer模式的使用,其中type为该Service的类型,指定为LoadBalancer即可使用该模式。

二、k8ssvc域名解析失败

1、检查dns配置

在kubernetes集群中,每个Pod都有一个默认的DNS配置文件(/etc/resolv.conf),该文件中会包含两个默认的nameserver,这些nameserver会用来解析所有的域名。在有些场景下,这些nameserver可能无法解析一些特殊的域名,因此我们可以在Pod的配置文件中手动设置dnsPolicy参数以使用自定义的DNS配置。

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
  dnsPolicy: "None"
  dnsConfig:
    nameservers:
      - 8.8.8.8   #使用谷歌公共DNS解析

2、使用Service名称作为域名

k8ssvc中,每个Service都有一个DNS记录,该DNS记录可以直接通过Service的名称进行访问。例如,我们有一个名为my-service的Service,可以通过my-service命名空间进行访问。如果是在同一命名空间中,则可以直接使用my-service进行访问。

http://my-service:80

3、使用Pod名称作为域名

在kubernetes集群中,每个Pod都有一个唯一的名称,该名称可以直接作为域名进行访问。例如,我们有一个名为my-pod的Pod,可以使用my-pod命名空间进行访问。如果是在同一命名空间中,则可以直接使用my-pod进行访问。

http://my-pod:80

三、k8ssvc的负载均衡策略

1、RoundRobin策略

RoundRobin策略是k8ssvc默认的负载均衡策略,它会将请求平均分配到所有的Pod上,遵循先到先服务的原则。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - name: http
      port: 80
      targetPort: http
  sessionAffinity: None   #不开启SessionAffinity即为默认的RoundRobin策略

2、IPHash策略

IPHash策略会基于请求的源IP进行Hash操作,将同一IP的请求分发到同一个Pod上。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - name: http
      port: 80
      targetPort: http
  sessionAffinity: ClientIP   #开启SessionAffinity即为IPHash策略

3、Random策略

Random策略会随机选择一个Pod进行响应,可以用于某些场景下对请求的延迟和性能要求不高的服务。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - name: http
      port: 80
      targetPort: http
  sessionAffinity: None
  type: LoadBalancer   #需要结合LoadBalancer模式使用

四、k8ssvc的安全设置

1、使用Service Account授权

在kubernetes中,每个Pod都会自动关联一个Service Account,用于与kubernetes API Server进行交互。我们可以通过为Service Account分配RBAC角色来限制该Service Account的权限。

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  serviceAccountName: my-serviceaccount
  containers:
  - name: my-container
    image: my-image

2、使用kubeconfig文件授权

使用kubeconfig文件可以为Service Account或某个用户分配一组认证信息,在访问kubernetes API Server时需要提供这组认证信息。

apiVersion: v1
kind: Config
users:
- name: my-user
  user:
    client-certificate: /path/to/my-cert.pem  #客户端证书
    client-key: /path/to/my-key.pem           #客户端私钥
clusters:
- name: my-cluster
  cluster:
    certificate-authority: /path/to/ca.pem   #CA证书
    server: "https://my-server:6443"         #kubernetes API Server地址
contexts:
- name: my-context
  context:
    user: my-user              #关联用户
    cluster: my-cluster        #关联集群
current-context: my-context    #设置当前上下文

3、设置安全策略

使用PodSecurityPolicy可以限制Pod的权限,包括容器的权限、存储卷的使用等。通过为kubernetes集群中的Pod分配相应的PodSecurityPolicy,可以在一定程度上提高安全性。

apiVersion: extensions/v1beta1
kind: PodSecurityPolicy
metadata:
  name: my-psp
spec:
  privileged: false
  allowedCapabilities:
  - NET_ADMIN
  seLinux:
    rule:
      # 禁止访问系统文件等
  volumes:
  - configMap
  - emptyDir
  - secret

总结

通过以上对于kubernetes service(k8ssvc)的详细解析,可以更好地理解k8ssvc的网络模式、域名解析、负载均衡策略以及安全设置等方面的应用场景及使用方法。在实际使用kubernetes进行开发时,我们需要根据具体的业务需求来选择合适的网络模式、负载均衡策略以及安全措施,以保证应用程序的高可用性、高性能及安全性。