두 가지 다른 서비스를 포함하는 다음 Statefulset을 배포 중입니다. 포드에 대한 클러스터 액세스를 위한 서비스 1개( crdb-service.yaml
)와 포드 내부 통신을 위한 서비스 1개( crdb.yaml
).
crdb-service.yaml
apiVersion: v1
kind: Service
metadata:
name: crdb-service
labels:
app: crdb
spec:
ports:
- port: 26257
targetPort: 26257
name: grpc
- port: 80
targetPort: 8080
name: http
selector:
app: crdb
crdb.yaml
apiVersion: v1
kind: Service
metadata:
name: crdb
labels:
app: crdb
annotations:
service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
prometheus.io/scrape: "true"
prometheus.io/path: "_status/vars"
prometheus.io/port: "8080"
spec:
ports:
- port: 26257
targetPort: 26257
name: grpc
- port: 8080
targetPort: 8080
name: http
publishNotReadyAddresses: true
clusterIP: None
selector:
app: crdb
statefulset.yaml
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: crdb
labels:
app: crdb
spec:
serviceName: "crdb"
replicas: 5
template:
metadata:
labels:
app: crdb
spec:
serviceAccountName: crdb
containers:
- name: crdb
image: cockroachdb/cockroach:v19.1.2
imagePullPolicy: IfNotPresent
ports:
- containerPort: 26257
name: grpc
- containerPort: 8080
name: http
livenessProbe:
httpGet:
path: "/health"
port: http
scheme: HTTPS
initialDelaySeconds: 30
periodSeconds: 5
readinessProbe:
httpGet:
path: "/health?ready=1"
port: http
scheme: HTTPS
initialDelaySeconds: 10
periodSeconds: 5
failureThreshold: 2
volumeMounts:
- name: datadir
mountPath: /cockroach/cockroach-data
- name: certs
mountPath: /cockroach/cockroach-certs
env:
- name: STATEFULSET_NAME
value: "crdb"
- name: STATEFULSET_FQDN
value: "crdb.default.svc.cluster.local"
- name: COCKROACH_CHANNEL
value: kubernetes-secure
command:
- "/bin/bash"
- "-ecx"
- "exec /cockroach/cockroach start --logtostderr --certs-dir /cockroach/cockroach-certs --advertise-host $(hostname -f) --http-host 0.0.0.0 --join crdb-0.crdb,crdb-1.crdb,crdb-2.crdb,crdb-3.crdb,crdb-4.crdb --cache 25% --max-sql-memory 25%"
terminationGracePeriodSeconds: 60
volumes:
- name: datadir
persistentVolumeClaim:
claimName: datadir
- name: certs
emptyDir: {}
podManagementPolicy: Parallel
updateStrategy:
type: RollingUpdate
volumeClaimTemplates:
- metadata:
name: datadir
spec:
accessModes:
- "ReadWriteOnce"
storageClassName: local-crdb-space
resources:
requests:
storage: 1800Gi
이제 배포된 서비스를 확인합니다.
$ kubectl describe service crdb
Name: crdb
Namespace: default
Labels: app=crdb
Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Service","metadata":{"annotations":{"prometheus.io/path":"_status/vars","prometheus.io/port":"8080","prometheus.io/scrape":"...
prometheus.io/path=_status/vars
prometheus.io/port=8080
prometheus.io/scrape=true
service.alpha.kubernetes.io/tolerate-unready-endpoints=true
Selector: app=crdb
Type: ClusterIP
IP: None
Port: grpc 26257/TCP
TargetPort: 26257/TCP
Endpoints: 10.244.10.24:26257,10.244.2.23:26257,10.244.3.18:26257 + 2 more...
Port: http 8080/TCP
TargetPort: 8080/TCP
Endpoints: 10.244.10.24:8080,10.244.2.23:8080,10.244.3.18:8080 + 2 more...
Session Affinity: None
Events: <none>
$ kubectl describe service crdb-service
Name: crdb-service
Namespace: default
Labels: app=crdb
Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"crdb"},"name":"crdb-service","namespace":"default"},"spec":{"ports":[...
Selector: app=crdb
Type: ClusterIP
IP: 10.100.71.172
Port: grpc 26257/TCP
TargetPort: 26257/TCP
Endpoints:
Port: http 80/TCP
TargetPort: 8080/TCP
Endpoints:
Session Affinity: None
Events: <none>
동일한 레이블 선택기가 있음에도 불구하고 클러스터 서비스의 엔드포인트 필드는 비어 있습니다. 확인 중https://github.com/kubernetes/kubernetes/issues/11795 https://kubernetes.io/docs/tasks/debug-application-cluster/debug-service원인을 밝히지 않습니다.
현재 문제와 관련될 수 있는 몇 가지 추가 정보입니다. 클러스터를 1.13 -> 1.14 -> 1.15에서 업데이트했습니다. 포드는 최근 클러스터에 추가된 노드에서 실행 중입니다. 이전에는 새 노드에 배포된 포드에 네트워킹 문제가 있었습니다(DNS 실패로 인해 액세스할 수 없었으며, net.ipv4.ip_forward = 1
새 노드에 설정하여 이 문제를 해결했습니다).
서비스가 포드를 인식하도록 하려면 어떻게 해야 합니까?
답변1
NVM, 방금 2시간을 낭비했습니다. publishNotReadyAddresses: true
시작 시 IP를 게시하는 포드에 대한 서비스에 추가해야 하는 필드입니다 .