K3S 全面解析
一、基础知识
1.1 K3S 简介
K3S 是一个轻量级的 Kubernetes 发行版,由 Rancher Labs 开发,旨在简化 Kubernetes 的部署和管理。它专为边缘计算、IoT 和开发环境设计,资源占用小且易于安装。
1.2 K3S 与传统 Kubernetes 的区别
- 资源占用:K3S 在内存和CPU使用上更为高效,适合资源受限的环境。
- 组件精简:K3S 移除了不必要的组件,如附加的存储和网络插件,简化了系统架构。
- 简单安装:只需一个命令即可安装,自动处理依赖项和配置。
- 高可用性支持:内置高可用性支持,通过外部数据库(如 SQLite)管理集群状态。
1.3 K3S 主要组件
- Kubelet:负责节点上容器的运行和管理。
- Kube-API Server:提供 Kubernetes API 接口,处理所有请求。
- Kube-Controller-Manager:管理控制循环的控制器。
- Kube-Scheduler:负责调度容器到各个节点。
- Containerd:用于运行容器的容器运行时。
二、安装与配置
2.1 K3S 安装步骤
在不同环境(如本地开发、云服务)中安装 K3S 的步骤略有不同。以下是一个简单的安装步骤:
在 Linux 上安装 K3S:
-
使用 curl 安装:
curl -sfL https://get.k3s.io | sh -
-
检查安装状态:
sudo k3s kubectl get nodes
2.2 K3S 配置
K3S 的配置文件通常位于 /etc/rancher/k3s/k3s.yaml
。可以通过编辑该文件来调整资源限制、网络设置等。
示例:
apiVersion: v1
kind: Config
clusters:
- cluster:
server: https://<server-ip>:6443
name: k3s
contexts:
- context:
cluster: k3s
user: admin
name: k3s
current-context: k3s
users:
- name: admin
user:
token: <your-token>
2.3 常见安装问题
- 问题:安装后无法访问 API 服务器。 解决:检查防火墙设置,确保端口开放。
- 问题:节点未能加入集群。 解决:确保网络连接正常,并检查 K3S 服务状态。
三、集群管理
3.1 创建和管理 K3S 集群
使用以下命令可以创建和管理 K3S 集群:
k3s server &
可以通过 kubectl
命令进行管理,例如查看节点状态:
kubectl get nodes
3.2 添加和移除节点
添加节点:
-
在主节点上获取 token:
cat /var/lib/rancher/k3s/server/node-token
-
在新节点上运行:
curl -sfL https://get.k3s.io | K3S_TOKEN=<your-token> sh -
移除节点: 使用 kubectl delete node
命令将节点移除。
3.3 高可用集群
K3S 支持高可用配置,可以使用 external datastore(如 etcd 或 MySQL)来实现:
k3s server --datastore-endpoint=<db-connection-string>
四、应用部署与管理
4.1 部署 Java 应用
在 K3S 上部署 Java 应用通常需要编写 Kubernetes YAML 配置文件,包括 Deployment 和 Service。
示例 YAML 文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: java-app
spec:
replicas: 2
selector:
matchLabels:
app: java-app
template:
metadata:
labels:
app: java-app
spec:
containers:
- name: java-app
image: your-java-app-image
ports:
- containerPort: 8080
4.2 扩缩容操作
可以通过调整 Deployment 的 replicas 属性来进行扩缩容:
kubectl scale deployment java-app --replicas=3
4.3 监控和管理应用
使用 kubectl get pods
查看应用状态,使用 kubectl logs
查看日志。
五、与其他技术的集成
5.1 K3S 与其他工具集成
K3S 的轻量级特性使其易于与多种 CI/CD 工具集成,从而提升开发和部署效率。以下是与常见 CI/CD 工具的集成示例:
1. K3S 与 Jenkins 集成
-
安装 Jenkins: 可以在 K3S 上通过 Helm 安装 Jenkins。
helm repo add jenkins https://charts.jenkins.io helm install jenkins jenkins/jenkins
-
配置 Jenkins Pipeline: 在 Jenkins 中配置一个 Pipeline,使用
kubectl
命令部署应用:pipeline { agent any stages { stage('Deploy') { steps { sh 'kubectl apply -f deployment.yaml' } } } }
-
使用 Jenkins Credentials: 在 Jenkins 中配置 K3S 的访问凭证,以便安全地访问 Kubernetes 集群。
2. K3S 与 GitLab CI 集成
-
配置 GitLab Runner: 在 K3S 上安装 GitLab Runner,使其可以运行 CI/CD 作业。
-
.gitlab-ci.yml 示例:
stages: - deploy deploy: stage: deploy script: - kubectl apply -f deployment.yaml
通过与 CI/CD 工具的集成,K3S 可以实现自动化部署、回滚等操作,从而提高团队的开发效率和部署可靠性。
5.2 K3S 与 Java 技术栈的集成
K3S 可以轻松与 Java 技术栈(如 Spring Boot)集成,以支持现代微服务架构。以下是与 Spring Boot 的集成示例:
1. Spring Boot 应用的容器化
-
Dockerfile 示例:
FROM openjdk:11-jre COPY target/myapp.jar /app.jar ENTRYPOINT ["java", "-jar", "/app.jar"]
-
构建 Docker 镜像:
docker build -t myapp:latest .
2. 在 K3S 中部署 Spring Boot 应用
-
Kubernetes Deployment YAML:
apiVersion: apps/v1 kind: Deployment metadata: name: myapp spec: replicas: 2 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: myapp image: myapp:latest ports: - containerPort: 8080
-
创建服务以暴露应用:
apiVersion: v1 kind: Service metadata: name: myapp-service spec: type: ClusterIP ports: - port: 80 targetPort: 8080 selector: app: myapp
3. 与其他服务的通信
- 可以通过 Spring Boot 的 RestTemplate 或 WebClient 访问 K3S 中的其他服务。配置 Kubernetes DNS 服务以简化服务间的通信。
示例代码:
@RestController
public class MyController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/callOtherService")
public String callOtherService() {
String response = restTemplate.getForObject("http://other-service/api", String.class);
return response;
}
}
通过与 Java 技术栈的集成,K3S 提供了一个高效、灵活的环境,使开发人员能够快速构建和部署微服务应用。
六、安全性
6.1 K3S 安全措施
K3S 提供多种安全措施,确保集群和应用的安全性:
1. RBAC(角色访问控制)
- K3S 使用 RBAC 来管理集群中的用户和服务的权限。
- 可以通过 YAML 文件定义角色和角色绑定,限制对资源的访问。
示例:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: myapp-role
rules:
- apiGroups: ["*"]
resources: ["pods", "pods/log"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: myapp-role-binding
namespace: default
subjects:
- kind: User
name: myuser
roleRef:
kind: Role
name: myapp-role
apiGroup: rbac.authorization.k8s.io
2. 网络策略
- K3S 支持网络策略,可以控制 pod 之间的通信。
- 通过定义网络策略,限制哪些 pod 可以访问其他 pod。
示例:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-app
namespace: default
spec:
podSelector:
matchLabels:
app: myapp
ingress:
- from:
- podSelector:
matchLabels:
app: myapp
6.2 部署应用的安全性
在 K3S 中部署应用时,确保采用以下安全措施:
1. 使用 HTTPS
- 确保所有的服务和 API 端点都通过 HTTPS 进行通信,防止中间人攻击。
2. 身份验证和授权
- 使用 OAuth2、JWT 或其他身份验证机制保护 API 端点。
3. 定期更新
- 定期更新 K3S 和所有运行的应用,及时修补安全漏洞。
4. 监控和日志记录
- 使用监控工具(如 Prometheus、Grafana)和日志管理工具(如 ELK Stack)跟踪应用的运行状态,及时发现异常行为。
通过实施这些安全措施,可以显著提高在 K3S 上部署的应用的安全性。