Service存在意义
防止pod失联,基于服务发现
例如将前端的服务和后端的服务分别部署在不同的pod上面的,前端访问后端的ip地址就需要通过service给他pod IP来获得其实际需要访问的地址,service和注册中心网有异曲同工的地方。
定义一组关于pod的访问策略(负载均衡)
负载均衡的策略可以根据很多指标来指定,每次都将任务分给较空闲的pod
Pod与Service的关系
service会根据标签对pod进行处理,selector中会记录标签对应的一些pod,每个pod上都绑定一个label。
service对外会创建一个虚拟ip(vip)收到请求之后会将请求转发到相应的pod当中。
常用的service类型
配置位置
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: web
type: NodePort/ClusterIP
status:
LoadBalancer: {}
(1)cluster IP:集群内部进行使用
(2)NodePort:对外暴露应用时使用
(3)LoadBalancer:对外访问应用使用,公有云
node内网部署应用,外网一般不能访问到
解决方案:
- 找到一台可以进行外网访问的机器,安装nginx,反向代理
- 手动把可以访问的节点添加到nginx里面
LoadBalancer:公有云,做到负载均衡,提供控制器,只需要连接控制器就可以将Node加到负载均衡当中。
Secret
加密数据存在etcd当中,让Pod容器以挂载Volume方式进行访问
场景:凭证
使用步骤:
- 创建一个secret加密的数据
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: (base64编码)
password: (base64编码)
kubectl create -f secret.yaml
以变量形式挂载到容器中
apiVersion: v1
kind: Secret
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret #需要和secret生成的名字一致
key: password
以Volume形式挂载到pod容器中
apiVersion: v1
kind: Secret
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx
valueMounts:
- name: foo
mountPath: "etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret #需要和secret生成的名字一致
之后就可以去相应的目录下访问账户和密码