mirror of
https://github.com/slurm-personal/school-dev-k8s.git
synced 2026-06-27 13:50:24 +00:00
fix: update apiversion, some small fixes
This commit is contained in:
@@ -0,0 +1,122 @@
|
||||
# StatefulSet
|
||||
|
||||
1) Переходим в директорию с практикой.
|
||||
|
||||
```bash
|
||||
cd ~/school-dev-k8s/practice/10.deployment-alternative/2.statefulset
|
||||
```
|
||||
|
||||
### Создаем стэйтфулсет
|
||||
|
||||
2) Применяем каталог с манифестами
|
||||
|
||||
```bash
|
||||
kubectl apply -f rabbitmq-statefulset
|
||||
```
|
||||
|
||||
В ответ должны увидеть
|
||||
|
||||
```bash
|
||||
configmap/rabbitmq-config created
|
||||
role.rbac.authorization.k8s.io/endpoint-reader created
|
||||
rolebinding.rbac.authorization.k8s.io/endpoint-reader created
|
||||
service/rabbitmq created
|
||||
serviceaccount/rabbitmq created
|
||||
statefulset.apps/rabbitmq created
|
||||
```
|
||||
|
||||
3) Смотрим на поды
|
||||
|
||||
```bash
|
||||
kubectl get pod
|
||||
```
|
||||
|
||||
Видим:
|
||||
|
||||
```bash
|
||||
NAME READY STATUS RESTARTS AGE
|
||||
rabbitmq-0 0/1 ContainerCreating 0 31s
|
||||
```
|
||||
|
||||
Поды начали создаваться по одному, с нулевого
|
||||
Ждем, пока get pod не вернет все три работающих пода
|
||||
Должно быть так:
|
||||
|
||||
```bash
|
||||
NAME READY STATUS RESTARTS AGE
|
||||
rabbitmq-0 1/1 Running 0 10m
|
||||
rabbitmq-1 1/1 Running 0 7m
|
||||
```
|
||||
|
||||
4) Проверяем что под каждый pod создался pvc
|
||||
|
||||
```bash
|
||||
kubectl get pvc
|
||||
```
|
||||
|
||||
Видим:
|
||||
|
||||
```bash
|
||||
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
|
||||
data-rabbitmq-0 Bound pvc-d9030631-496e-11e9-96e5-4201ac101193 2Gi RWO standard 10m
|
||||
data-rabbitmq-1 Bound pvc-01c40ac5-496f-11e9-96e5-4201ac101193 2Gi RWO standard 7m
|
||||
```
|
||||
|
||||
## Проверяем сервис
|
||||
|
||||
5) Запускаем под для тестов
|
||||
|
||||
```bash
|
||||
kubectl run -t -i --rm --image centosadmin/utils:0.3 test bash
|
||||
```
|
||||
|
||||
6) Дальше уже из этого пода выполняем:
|
||||
|
||||
```bash
|
||||
nslookup rabbitmq
|
||||
```
|
||||
|
||||
В ответ видим, что DNS возвращает IP всех подов (IP подов можно проверить в соседней консоли через kubectl get pod -o wide)
|
||||
|
||||
```bash
|
||||
Server: 10.107.0.10
|
||||
Address: 10.107.0.10#53
|
||||
|
||||
Name: rabbitmq.default.svc.cluster.local
|
||||
Address: 10.107.16.12
|
||||
Name: rabbitmq.default.svc.cluster.local
|
||||
Address: 10.107.16.13
|
||||
Name: rabbitmq.default.svc.cluster.local
|
||||
Address: 10.107.18.24
|
||||
```
|
||||
|
||||
7) Пробуем резолвить конкретный инстанс
|
||||
|
||||
```bash
|
||||
nslookup rabbitmq-0.rabbitmq
|
||||
```
|
||||
|
||||
В ответ видим, что DNS возвращает IP пода rabbitmq-0
|
||||
|
||||
```bash
|
||||
Server: 10.107.0.10
|
||||
Address: 10.107.0.10#53
|
||||
|
||||
Name: rabbitmq-0.rabbitmq.default.svc.cluster.local
|
||||
Address: 10.107.16.12
|
||||
```
|
||||
|
||||
8) Выходим из тестового пода
|
||||
|
||||
```bash
|
||||
exit
|
||||
```
|
||||
|
||||
9) Чистим за собой кластер
|
||||
|
||||
```bash
|
||||
kubectl delete -f rabbitmq-statefulset
|
||||
kubectl delete pvc --all
|
||||
```
|
||||
|
||||
Обязательно удаляем PVC отдельно! Удаление стэйтфулсета не чистит PVC
|
||||
@@ -0,0 +1,30 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: rabbitmq-config
|
||||
data:
|
||||
enabled_plugins: |
|
||||
[rabbitmq_peer_discovery_k8s].
|
||||
rabbitmq.conf: |
|
||||
## Cluster formation. See http://www.rabbitmq.com/cluster-formation.html to learn more.
|
||||
cluster_formation.peer_discovery_backend = rabbit_peer_discovery_k8s
|
||||
cluster_formation.k8s.host = kubernetes.default
|
||||
## Should RabbitMQ node name be computed from the pod's hostname or IP address?
|
||||
## IP addresses are not stable, so using [stable] hostnames is recommended when possible.
|
||||
## Set to "hostname" to use pod hostnames.
|
||||
## When this value is changed, so should the variable used to set the RABBITMQ_NODENAME
|
||||
## environment variable.
|
||||
cluster_formation.k8s.address_type = hostname
|
||||
## How often should node cleanup checks run?
|
||||
cluster_formation.node_cleanup.interval = 30
|
||||
## Set to false if automatic removal of unknown/absent nodes
|
||||
## is desired. This can be dangerous, see
|
||||
## * http://www.rabbitmq.com/cluster-formation.html#node-health-checks-and-cleanup
|
||||
## * https://groups.google.com/forum/#!msg/rabbitmq-users/wuOfzEywHXo/k8z_HWIkBgAJ
|
||||
cluster_formation.node_cleanup.only_log_warning = true
|
||||
cluster_partition_handling = autoheal
|
||||
## See http://www.rabbitmq.com/ha.html#master-migration-data-locality
|
||||
queue_master_locator=min-masters
|
||||
## See http://www.rabbitmq.com/access-control.html#loopback-users
|
||||
loopback_users.guest = false
|
||||
@@ -0,0 +1,9 @@
|
||||
---
|
||||
kind: Role
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
metadata:
|
||||
name: endpoint-reader
|
||||
rules:
|
||||
- apiGroups: [""]
|
||||
resources: ["endpoints"]
|
||||
verbs: ["get"]
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
---
|
||||
kind: RoleBinding
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
metadata:
|
||||
name: endpoint-reader
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: rabbitmq
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: Role
|
||||
name: endpoint-reader
|
||||
@@ -0,0 +1,16 @@
|
||||
---
|
||||
kind: Service
|
||||
apiVersion: v1
|
||||
metadata:
|
||||
name: rabbitmq
|
||||
labels:
|
||||
app: rabbitmq
|
||||
spec:
|
||||
clusterIP: None
|
||||
ports:
|
||||
- name: amqp
|
||||
protocol: TCP
|
||||
port: 5672
|
||||
targetPort: 5672
|
||||
selector:
|
||||
app: rabbitmq
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: rabbitmq
|
||||
+92
@@ -0,0 +1,92 @@
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: StatefulSet
|
||||
metadata:
|
||||
name: rabbitmq
|
||||
spec:
|
||||
serviceName: rabbitmq
|
||||
replicas: 2
|
||||
selector:
|
||||
matchLabels:
|
||||
app: rabbitmq
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: rabbitmq
|
||||
spec:
|
||||
serviceAccountName: rabbitmq
|
||||
terminationGracePeriodSeconds: 10
|
||||
containers:
|
||||
- name: rabbitmq-k8s
|
||||
image: rabbitmq:3.7
|
||||
env:
|
||||
- name: MY_POD_IP
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: status.podIP
|
||||
- name: RABBITMQ_USE_LONGNAME
|
||||
value: "true"
|
||||
- name: RABBITMQ_NODENAME
|
||||
value: "rabbit@$(MY_POD_IP)"
|
||||
- name: K8S_SERVICE_NAME
|
||||
value: "rabbitmq"
|
||||
- name: RABBITMQ_ERLANG_COOKIE
|
||||
value: "mycookie"
|
||||
ports:
|
||||
- name: amqp
|
||||
protocol: TCP
|
||||
containerPort: 5672
|
||||
resources:
|
||||
limits:
|
||||
cpu: 1000m
|
||||
memory: 1024Mi
|
||||
requests:
|
||||
cpu: 10m
|
||||
memory: 256Mi
|
||||
livenessProbe:
|
||||
exec:
|
||||
command: ["rabbitmqctl", "status"]
|
||||
initialDelaySeconds: 60
|
||||
periodSeconds: 60
|
||||
timeoutSeconds: 15
|
||||
readinessProbe:
|
||||
exec:
|
||||
command: ["rabbitmqctl", "status"]
|
||||
initialDelaySeconds: 20
|
||||
periodSeconds: 60
|
||||
timeoutSeconds: 10
|
||||
imagePullPolicy: Always
|
||||
volumeMounts:
|
||||
- name: config-volume
|
||||
mountPath: /etc/rabbitmq
|
||||
- name: data
|
||||
mountPath: /var/lib/rabbitmq
|
||||
volumes:
|
||||
- name: config-volume
|
||||
configMap:
|
||||
name: rabbitmq-config
|
||||
items:
|
||||
- key: rabbitmq.conf
|
||||
path: rabbitmq.conf
|
||||
- key: enabled_plugins
|
||||
path: enabled_plugins
|
||||
affinity:
|
||||
podAntiAffinity:
|
||||
preferredDuringSchedulingIgnoredDuringExecution:
|
||||
- weight: 100
|
||||
podAffinityTerm:
|
||||
labelSelector:
|
||||
matchExpressions:
|
||||
- key: app
|
||||
operator: In
|
||||
values:
|
||||
- rabbitmq
|
||||
topologyKey: kubernetes.io/hostname
|
||||
volumeClaimTemplates:
|
||||
- metadata:
|
||||
name: data
|
||||
spec:
|
||||
accessModes: ["ReadWriteOnce"]
|
||||
resources:
|
||||
requests:
|
||||
storage: 20Mi
|
||||
Reference in New Issue
Block a user