Kubernetes (K8S)
Referenční dovednost pro Kubernetes: příkazy kubectl pro pody, deploymenty, služby, síťování, RBAC, Helm a řešení problémů v clusteru.
Co tato dovednost pokrývá
Provoz Kubernetes (K8s) od základní správy podů přes deployment strategie, síťování a bezpečnost až po administraci clusteru — příkazy kubectl a helm a YAML manifesty potřebné k běžnému provozu a řešení problémů clusteru.
Kdy ji použít
- Zakládání nebo administrace Kubernetes clusteru (uzly, namespacy, RBAC)
- Nasazení, škálování nebo rollback aplikace pomocí Deploymentů
- Ladění podu uvízlého ve stavu
Pending,CrashLoopBackOffneboImagePullBackOff - Vystavení služby dovnitř nebo ven (Services, Ingress, DNS)
- Správa konfigurace a tajemství (ConfigMaps, Secrets, TLS, přihlašovací údaje k registru)
- Instalace nebo upgrade aplikací pomocí Helm chartů
- Vyšetřování uzlu ve stavu
NotReadynebo tlaku na zdroje - Psaní nebo revize Kubernetes YAML manifestů (Pod, Deployment, Service)
Základní koncepty
Architektura Kubernetes
- Control Plane: API Server, etcd, Controller Manager, Scheduler
- Worker Nodes: Kubelet, Kube Proxy, Container Runtime
- Pods: Nejmenší nasaditelná jednotka obsahující jeden nebo více kontejnerů
- Services: Síťová abstrakce pro pody
- Deployments: Deklarativní způsob správy replik podů
- ConfigMaps/Secrets: Správa konfigurace a citlivých dat
Správa podů
Základní příkazy pro pody
# Get pods
kubectl get pods
kubectl get pods -o wide # Detailed view
kubectl get pods -w # Watch mode
kubectl get pods -o yaml # YAML output
# Pod operations
kubectl describe pod <pod-name> # Detailed information
kubectl logs <pod-name> # View logs
kubectl logs -f <pod-name> # Follow logs
kubectl exec -it <pod-name> -- /bin/bash # Execute into pod
# Pod lifecycle
kubectl delete pod <pod-name> # Delete pod
kubectl edit pod <pod-name> # Edit pod
Vytváření podů
# Create pod from image
kubectl run <pod-name> --image=<image-name>
# Create pod with port and expose as service
kubectl run <pod-name> --image=<image-name> --port=<port> --expose
# Generate pod YAML
kubectl run <pod-name> --image=<image-name> --dry-run=client -o yaml > pod.yaml
Správa uzlů
Operace s uzly
# Get nodes
kubectl get nodes
kubectl get nodes -o wide
kubectl describe node <node-name>
# Node maintenance
kubectl drain <node-name> # Safely evict pods
kubectl cordon <node-name> # Mark as unschedulable
kubectl uncordon <node-name> # Allow scheduling
Vytváření zdrojů
Aplikace manifestů
# Apply single file
kubectl apply -f <file>.yaml
# Apply multiple files
kubectl apply -f <file1>.yaml -f <file2>.yaml
# Apply directory
kubectl apply -f ./<directory>/
# Apply from URL
kubectl apply -f https://<url>
Imperativní vytváření zdrojů
# Create deployment
kubectl create deployment <name> --image=<image>
kubectl create deployment <name> --image=<image> --dry-run=client -o yaml > deployment.yaml
# Create service
kubectl create service <type> <name> --tcp=<port>:<target-port>
kubectl create service <type> <name> --tcp=<port>:<target-port> --dry-run=client -o yaml > service.yaml
# Expose existing deployment
kubectl expose deployment <name> --type=<type> --port=<port> --target-port=<target-port>
Správa konfigurace
# Create ConfigMap
kubectl create configmap <name> --from-literal=<key>=<value>
kubectl create configmap <name> --from-file=<file>
kubectl create configmap <name> --from-env-file=<file>
# Create Secret
kubectl create secret generic <name> --from-literal=<key>=<value>
kubectl create secret generic <name> --from-file=<file>
Monitoring a řešení problémů
Monitorování zdrojů
# Node utilization
kubectl top nodes
kubectl top node <node-name>
# Pod utilization
kubectl top pods
kubectl top pods <pod-name>
Ladicí příkazy
# Check pod status
kubectl get pods
kubectl describe pod <pod-name>
# Check logs
kubectl logs <pod-name>
kubectl logs <pod-name> -c <container-name> # Multi-container pods
# Check events
kubectl get events
kubectl get events --sort-by=.metadata.creationTimestamp
# Port forwarding for debugging
kubectl port-forward pod/<pod-name> <local-port>:<pod-port>
Správa deploymentů
Operace s deploymenty
# Get deployments
kubectl get deployments
kubectl get deployment <deployment-name>
kubectl describe deployment <deployment-name>
# Scale deployment
kubectl scale deployment <name> --replicas=<count>
# Update deployment
kubectl set image deployment/<name> <container>=<new-image>
kubectl rollout status deployment/<name>
# Rollback deployment
kubectl rollout undo deployment/<name>
kubectl rollout undo deployment/<name> --to-revision=<number>
Rolling updates
# Check rollout status
kubectl rollout status deployment/<name>
# Pause/resume rollout
kubectl rollout pause deployment/<name>
kubectl rollout resume deployment/<name>
# View rollout history
kubectl rollout history deployment/<name>
Správa služeb
Typy služeb
# ClusterIP (default)
kubectl create service clusterip <name> --tcp=<port>:<target-port>
# NodePort
kubectl create service nodeport <name> --tcp=<port>:<target-port> --node-port=<node-port>
# LoadBalancer
kubectl create service loadbalancer <name> --tcp=<port>:<target-port>
# ExternalName
kubectl create service externalname <name> --external-name=<external-name>
Objevování služeb
# Get services
kubectl get services
kubectl get svc
kubectl describe service <name>
# Test service connectivity
kubectl run test-pod --image=busybox --rm -it -- wget <service-name>:<port>
Konfigurace a úložiště
Persistentní svazky
# Get PV/PVC
kubectl get pv
kubectl get pvc
# Create PVC
kubectl apply -f pvc.yaml
# Check storage classes
kubectl get storageclass
Správa Ingress
# Get ingresses
kubectl get ingress
kubectl describe ingress <name>
# Create ingress
kubectl create ingress <name> --rule="<host>/<path>=<service>:<port>"
Pokročilé operace
Namespacy
# Get namespaces
kubectl get namespaces
kubectl get ns
# Create namespace
kubectl create namespace <name>
# Switch context to namespace
kubectl config set-context --current --namespace=<name>
# Get resources in all namespaces
kubectl get pods --all-namespaces
Labely a selektory
# Label resources
kubectl label pods <pod-name> app=web
kubectl label nodes <node-name> disktype=ssd
# Select with labels
kubectl get pods -l app=web
kubectl get pods -l 'app in (web,api)'
# Remove labels
kubectl label pods <pod-name> app-
Kvóty zdrojů
# Get resource quotas
kubectl get resourcequotas
kubectl describe resourcequota <name>
# Create resource quota
kubectl create quota <name> --hard=cpu=2,memory=4Gi,pods=10
Síťování
Síťové politiky
# Get network policies
kubectl get networkpolicies
kubectl describe networkpolicy <name>
# Apply network policy
kubectl apply -f network-policy.yaml
DNS a služby
# Service DNS format
<service-name>.<namespace>.svc.cluster.local
# Test DNS resolution
kubectl run test-pod --image=busybox --rm -it -- nslookup <service-name>
Bezpečnost
RBAC (Role-Based Access Control)
# Get roles/rolebindings
kubectl get roles
kubectl get rolebindings
kubectl get clusterroles
kubectl get clusterrolebindings
# Create service account
kubectl create serviceaccount <name>
# Bind role to user/serviceaccount
kubectl create rolebinding <name> --role=<role> --user=<user>
Správa Secrets
# Get secrets
kubectl get secrets
kubectl describe secret <name>
# Create TLS secret
kubectl create secret tls <name> --cert=<cert-file> --key=<key-file>
# Create docker registry secret
kubectl create secret docker-registry <name> --docker-server=<server> --docker-username=<user> --docker-password=<pass>
Helm (správce balíčků)
Operace v Helm
# Install chart
helm install <release-name> <chart-name>
# Upgrade release
helm upgrade <release-name> <chart-name>
# List releases
helm list
# Uninstall release
helm uninstall <release-name>
# Add repository
helm repo add <name> <url>
helm repo update
Řešení běžných problémů
Problémy s pody
# Pod stuck in Pending
kubectl describe pod <pod-name> # Check events
kubectl get nodes # Check node capacity
# Pod CrashLoopBackOff
kubectl logs <pod-name> # Check application logs
kubectl describe pod <pod-name> # Check exit codes
# Pod in ImagePullBackOff
kubectl describe pod <pod-name> # Check image pull errors
kubectl get secrets # Check registry credentials
Problémy se službami
# Service not accessible
kubectl get endpoints <service-name> # Check if pods are selected
kubectl get pods -l <selector> # Check pod labels
# DNS resolution issues
kubectl run test-pod --image=busybox --rm -it -- nslookup <service-name>
Problémy s uzly
# Node NotReady
kubectl describe node <node-name> # Check conditions
kubectl logs <kubelet-pod> -n kube-system # Check kubelet logs
# Resource pressure
kubectl top nodes # Check resource usage
kubectl get pods -o wide # Check pod distribution
Osvědčené postupy
- Limity zdrojů: Vždy nastavte limity CPU/paměti
- Health Checks: Implementujte readiness a liveness probes
- Rolling Updates: Pro nasazení bez výpadku používejte rolling update strategii
- Správa Secrets: Nikdy neukládejte tajemství do kódu ani configmap
- Síťové politiky: Implementujte síťovou segmentaci
- Monitoring: Zaveďte komplexní monitoring a alerting
- Zálohování: Pravidelně zálohujte etcd a persistentní data
- Aktualizace: Udržujte cluster i aplikace aktuální
- Bezpečnost: Implementujte RBAC, skenujte image, používejte security contexts
- Dokumentace: Dokumentujte konfiguraci a procesy clusteru
Příklady YAML manifestů
Manifest Pod
apiVersion: v1
kind: Pod
metadata:
name: my-pod
labels:
app: my-app
spec:
containers:
- name: my-container
image: nginx:latest
ports:
- containerPort: 80
resources:
limits:
cpu: 100m
memory: 128Mi
requests:
cpu: 50m
memory: 64Mi
Manifest Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: nginx:latest
ports:
- containerPort: 80
Manifest Service
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- port: 80
targetPort: 80
type: ClusterIP