Kubernetes (K8s) — это платформа с открытым исходным кодом для автоматизации развёртывания, масштабирования и управления контейнеризированными приложениями. Разработан Google на основе 15-летнего опыта управления продакшн-нагрузками.
Минимальная единица развёртывания. Может содержать один или несколько контейнеров с общим сетевым пространством и хранилищем.
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /healthz
port: 80
initialDelaySeconds: 3
periodSeconds: 10
Управляет ReplicaSet и обеспечивает декларативное обновление подов.
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
labels:
app: web
spec:
replicas: 3
selector:
matchLabels:
app: web
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: myapp:1.0.0
ports:
- containerPort: 8000
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: db-secret
key: url
volumeMounts:
- name: config
mountPath: /app/config
volumes:
- name: config
configMap:
name: app-config
Абстракция для доступа к группе подов по стабильному адресу.
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
type: ClusterIP # или LoadBalancer, NodePort
selector:
app: web
ports:
- port: 80
targetPort: 8000
protocol: TCP
Управление внешним HTTP/HTTPS-доступом к сервисам.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
ingressClassName: nginx
tls:
- hosts:
- example.com
secretName: tls-secret
rules:
- host: example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
config.yaml: |
server:
port: 8000
debug: false
features:
cache: enabled
LOG_LEVEL: "info"
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
stringData:
url: "postgresql://user:password@db:5432/mydb"
password: "supersecret"
# Контекст и кластер
kubectl config get-contexts
kubectl config use-context production
# Получение информации
kubectl get pods
kubectl get pods -o wide
kubectl get deployments
kubectl get services
kubectl get all -n my-namespace
# Описание и логи
kubectl describe pod web-app-xxx
kubectl logs web-app-xxx
kubectl logs -f web-app-xxx # follow
kubectl logs web-app-xxx -c sidecar # конкретный контейнер
# Применение манифестов
kubectl apply -f deployment.yaml
kubectl apply -f k8s/ # вся директория
kubectl delete -f deployment.yaml
# Масштабирование
kubectl scale deployment web-app --replicas=5
# Обновление
kubectl set image deployment/web-app web=myapp:2.0.0
kubectl rollout status deployment/web-app
kubectl rollout undo deployment/web-app
# Выполнение команд
kubectl exec -it web-app-xxx -- bash
kubectl exec web-app-xxx -- cat /app/config.yaml
# Порт-форвардинг
kubectl port-forward pod/web-app-xxx 8080:8000
kubectl port-forward service/web-service 8080:80
# Создание namespace
kubectl create namespace production
# Работа в namespace
kubectl get pods -n production
kubectl apply -f deployment.yaml -n production
# Установка namespace по умолчанию
kubectl config set-context --current --namespace=production
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: standard
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgres
spec:
serviceName: postgres
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:16
volumeMounts:
- name: data
mountPath: /var/lib/postgresql/data
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
# Установка чарта
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install my-postgres bitnami/postgresql
# Кастомные значения
helm install my-app ./my-chart -f values.yaml
# Обновление
helm upgrade my-app ./my-chart
# Список релизов
helm list
# Удаление
helm uninstall my-app