一、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进行开发时,我们需要根据具体的业务需求来选择合适的网络模式、负载均衡策略以及安全措施,以保证应用程序的高可用性、高性能及安全性。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/242930.html
微信扫一扫
支付宝扫一扫