我正在Kubernetes上通过Helm运行Redis,想知道如何从我的应用程序引用主Pod,该应用程序也作为Kubernetes在Pod中运行。 Helm足以创建ClusterIP
服务,但是我仍然不清楚我的应用程序中始终引用主服务器的内容:
MacBook-Pro ➜ api git:(master) ✗ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ignoble-hyena-redis-master ClusterIP 10.100.187.188 <none> 6379/TCP 5h21m
ignoble-hyena-redis-slave ClusterIP 10.100.236.164 <none> 6379/TCP 5h21m
MacBook-Pro ➜ api git:(master) ✗ kubectl describe service ignoble-hyena-redis-master
Name: ignoble-hyena-redis-master
Namespace: default
Labels: app=redis
chart=redis-9.0.1
heritage=Tiller
release=ignoble-hyena
Annotations: <none>
Selector: app=redis,release=ignoble-hyena,role=master
Type: ClusterIP
IP: 10.100.187.188
Port: redis 6379/TCP
TargetPort: redis/TCP
Endpoints: 192.168.34.46:6379
Session Affinity: None
Events: <none>
我使用:redis://my-password@ignoble-hyena-redis-master:6379
。每当我重新部署Helm图表时,吊舱名称都会更改,这似乎很脆弱。在Kubernetes集群中处理内部服务发现的推荐方法是什么?
答案 0 :(得分:1)
您应该package your application as a Helm chart。这基本上涉及到运行helm create
,然后将现有的部署YAML复制到templates
目录中。 Charts can have dependencies,因此您可以声明您的应用程序需要Redis。使用standard Helm charts repository中的版本,您可以说类似
# I am requirements.yaml
- name: redis
version: ~9.0.2
repository: https://kubernetes-charts.storage.googleapis.com
此处的重要细节是您的应用程序及其Redis将具有相同的Helm发行版名称-如果您的应用程序为ignoble-hyena-myapp
,则其Redis将为ignoble-hyena-redis-master
。您可以使用模板在部署YAML规范中进行设置
env:
- name: REDIS_HOST
value: {{ .Release.Name }}-redis-master
由于Kubernetes在内部工作的方式,即使您将图表helm upgrade
设置为更新的图片标签,它也通常不会触及Redis。 Helm将上传与旧版本完全相同的Redis工件的新版本,Kubernetes将不采取任何行动。
答案 1 :(得分:0)
我找不到详细记录的文件,但是按照模板代码,您应该可以将fullnameOverride
value设置为您控制的某个字符串,并且redis主文件将显示为<yourFullname>-master
,并且您可以让客户通过它达到目标。如果您的客户位于其他命名空间中,则可以通过<yourFullname>-master.<redisMasterServiceNamespace>
与主服务器联系。