Kubernetes 入门:概念、安装与基本使用

small parking
目录

什么是 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、服务网格等)请关注后续文章。