一、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进行开发时,我们需要根据具体的业务需求来选择合适的网络模式、负载均衡策略以及安全措施,以保证应用程序的高可用性、高性能及安全性。