Kubernetes 入门:概念、安装与基本使用
目录
什么是 Kubernetes?
Kubernetes(简称 K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。它可以把你的一堆 Docker 容器组织成一个高可用的系统,自动处理节点故障、负载均衡、滚动升级等问题。
简单说,它让容器化应用的生产管理变得简单。
K3s 是什么?
K3s 是 Rancher 推出的轻量级 Kubernetes 发行版,专为边缘计算、物联网和低资源环境设计。它把多个 K8s 组件打包成一个不超过 100MB 的二进制文件,并且默认使用 containerd 作为容器运行时,不需要额外的 Docker 守护进程。
K3s 完全兼容 Kubernetes API,所有 kubectl 命令都可以正常使用。对于个人学习或小规模部署,K3s 是一个非常省心的选择。
安装 K3s
单节点服务器安装
最简单的方式是用一条命令安装:
curl -sfL https://get.k3s.io | sh -
安装完成后,K3s 会作为 systemd 服务自动运行。检查节点状态:
sudo k3s kubectl get node
大约 30 秒后,节点状态会变成 Ready。
获取 kubeconfig
K3s 安装后会默认生成 /etc/rancher/k3s/k3s.yaml。如果你想用普通用户操作,可以:
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
推荐设置 alias 方便使用:
alias k=kubectl
alias kna='kubectl get pods -A -o wide'
alias kl='kubectl logs'
alias ks='kubectl get svc -o wide'
alias kaf='kubectl apply -f'
alias kd='kubectl describe'
alias kv='kubectl get svc'
核心概念
Pod
Pod 是 K8s 中最小的部署单元,一个 Pod 可以包含一个或多个容器。同一 Pod 内的容器共享网络和存储。你可以把 Pod 想象成一个"逻辑主机"。
Deployment
Deployment 管理 Pod 的生命周期,保证指定数量的 Pod 副本始终运行。即使某个节点故障,Deployment 会自动在其他节点上创建新 Pod。
Service
Service 为一组 Pod 提供稳定的网络入口。即使 Pod 的 IP 发生变化(重启、扩容),Service 的 IP 保持不变。
Service 有以下几种类型:
- ClusterIP:仅集群内部访问
- NodePort:在每个节点上暴露端口,可外部访问
- LoadBalancer:使用云服务商的外部负载均衡器
Namespace
Namespace 用于隔离资源,相当于"虚拟集群"。常用 Namespace 包括:
default:默认命名空间kube-system:K8s 系统资源kube-public:公开资源
Label 与 Selector
Label 是附加在资源上的键值对,用于标识和筛选资源。例如:
kubectl get pods -A --show-labels
Selector 基于 Label 匹配资源,常用于 Deployment 和 Service 配置中。
Ingress
Ingress 管理外部访问集群内部的 HTTP/HTTPS 请求,提供域名路由、TLS 终止等功能。它通常由 Ingress Controller(如 Nginx、KIC)来实现。
基本使用
kubectl 常用命令
# 查看集群资源
kubectl api-resources
# 查看所有命名空间的 Pod
kubectl get pods -A
# 查看详细信息
kubectl describe pod <pod-name>
# 进入容器
kubectl exec -it <pod-name> -- bash
# 查看日志
kubectl logs <pod-name>
# 创建资源
kubectl apply -f <file.yaml>
# 删除资源
kubectl delete -f <file.yaml>
实战:部署一个应用
1. 创建 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: coffee-deploy
labels:
app: coffee
spec:
replicas: 3
selector:
matchLabels:
app: coffee
template:
metadata:
labels:
app: coffee
spec:
containers:
- name: coffee
image: tmlake/coffee:latest
ports:
- containerPort: 8080
应用配置:
kubectl apply -f deploy.yaml
2. 创建 Service
apiVersion: v1
kind: Service
metadata:
name: coffee-svc
spec:
selector:
app: coffee
ports:
- port: 80
targetPort: 8080
type: ClusterIP
3. 创建 Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: coffee-ingress
spec:
rules:
- host: cafe.example.com
http:
paths:
- path: /tea
pathType: Prefix
backend:
service:
name: coffee-svc
port:
number: 80
4. 测试访问
port=80
ip=10.96.101.224 # KIC Service IP
curl --resolve "cafe.example.com:${port}:${ip}" \
http://cafe.example.com:${port}/tea
Service 类型实战
如果需要外部直接访问,可以将 Service 类型改为 LoadBalancer:
apiVersion: v1
kind: Service
metadata:
name: coffee-svc
spec:
type: LoadBalancer
selector:
app: coffee
ports:
- port: 80
targetPort: 8080
也可以使用 externalIPs 模拟公网 IP 行为:
externalIPs:
- 192.168.40.104
调试与排错
进入 KIC 容器
kubectl -n <namespace> exec -it <pod-name> -- bash
总结
Kubernetes 是一个强大的容器编排平台,而 K3s 让它变得轻量易用。掌握 Pod、Service、Deployment、Ingress 等核心概念后,你就能够自信地管理容器化应用了。
更多进阶内容(如 Ingress Controller、服务网格等)请关注后续文章。