哈喽,大家好,我是左手python!
在所有节点上安装Docker Engine,并确保节点之间的网络互通。以下是安装Docker Engine的示例代码:
# 更新包索引
sudo apt update
# 安装必要的依赖项
sudo apt install apt-transport-https ca-certificates curl software-properties-common
# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 添加Docker仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 更新包索引并安装Docker Engine
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
3. Docker Swarm集群安装与配置
Docker Swarm是Docker官方提供的一款简单易用的容器编排工具,适合中小型企业快速搭建容器化集群。
3.1 Swarm集群架构
Swarm集群由以下几个角色组成:
- Manager节点:负责集群的管理和调度,维护集群的状态和任务分配。
- Worker节点:负责运行容器,执行Manager节点分配的任务。
3.2 初始化Swarm集群
在Manager节点上执行以下命令初始化Swarm集群:
# 初始化Swarm集群
sudo docker swarm init --advertise-addr <manager-ip>:2377
# 输出示例:
# Swarm initialized: current node (c5dx5q8tx0f1p4yru72a1j9m) is now a manager.
# To add a worker to this swarm, run the following command:
# docker swarm join --token <worker-token> <manager-ip>:2377
3.3 加入Worker节点
在Worker节点上执行以下命令加入Swarm集群:
# 使用生成的token加入Swarm集群
sudo docker swarm join --token <worker-token> <manager-ip>:2377
3.4 验证Swarm集群
在Manager节点上执行以下命令验证Swarm集群的状态:
# 查看Swarm节点列表
sudo docker node ls
# 输出示例:
# ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
# c5dx5q8tx0f1p4yru72a1j9m * manager Ready Active Leader 23.0.1
# 3b4uba4y7t1cjf4p4h1c3g4q worker1 Ready Active 23.0.1
# 5q8k7ym4y2j3z4i8p3k5m6n worker2 Ready Active 23.0.1
4. Kubernetes集群安装与配置
对于大规模的企业级应用,Kubernetes是更为强大的容器编排工具,提供了丰富的功能和高可扩展性。
4.1 Kubernetes集群架构
Kubernetes集群由以下几个核心组件组成:
- Master节点:负责集群的管理和调度,包括API Server、Scheduler、Controller Manager和Etcd。
- Worker节点:负责运行容器,执行Master节点分配的任务。
- Etcd:分布式键值存储,用于存储集群的状态和配置。
4.2 使用kubeadm安装Kubernetes集群
kubeadm是Kubernetes官方提供的集群安装工具,支持快速搭建生产级集群。
4.2.1 初始化Master节点
在Master节点上执行以下命令初始化Kubernetes集群:
# 初始化Kubernetes集群
sudo kubeadm init --apiserver-advertise-address=<master-ip> --pod-network-cidr=10.244.0.0/16
# 输出示例:
# Your Kubernetes control-plane has been initialized successfully!
# To start using your cluster, you can run:
# mkdir -p $HOME/.kube
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# sudo chown $(id -u):$(id -g) $HOME/.kube/config
4.2.2 加入Worker节点
在Worker节点上执行以下命令加入Kubernetes集群:
# 使用生成的token加入Kubernetes集群
sudo kubeadm join <master-ip>:8443 --token <token>
4.2.3 验证Kubernetes集群
在Master节点上执行以下命令验证Kubernetes集群的状态:
# 查看Kubernetes节点列表
kubectl get nodes
# 输出示例:
# NAME STATUS ROLES AGE VERSION
# master Ready control-plane,master 10m v1.26.0
# worker1 Ready <none> 5m v1.26.0
# worker2 Ready <none> 5m v1.26.0
5. 集群配置与优化
5.1 网络配置
在容器化集群中,网络配置是关键的一环。以下是常见的网络模型:
- bridge网络:适用于单主机场景,容器之间通过虚拟桥接通信。
- overlay网络:适用于多主机场景,容器之间通过覆盖网络通信。
- host网络:容器直接使用主机的网络栈,适用于高性能场景。
以下是配置overlay网络的示例:
# 配置overlay网络
kind: NetworkAttachmentDefinition
apiVersion: k8s.cni.cncf.io/v1
metadata:
name: overlay-network
spec:
config: |
{
"name": "overlay-network",
"type": "overlay",
"cniVersion": "0.3.1",
"bridge": "docker0",
"ipam": {
"type": "host-local",
"ranges": [
[
{
"subnet": "10.244.0.0/16",
"rangeStart": "10.244.1.0",
"rangeEnd": "10.244.1.255",
"gateway": "10.244.0.1"
}
]
]
}
}
5.2 存储配置
在企业级应用中,存储是关键组件之一。以下是常见的存储方案:
- 本地存储:适用于无需共享的数据,例如日志文件。
- 网络存储:如NFS、Ceph等,适用于需要共享的数据。
- 分布式存储:如Kubernetes的Persistent Volume(PV),适用于云原生应用。
以下是配置NFS存储的示例:
# 配置NFS存储类
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-storage
parameters:
provisioner: example.com/nfs
server: <nfs-server-ip>
path: /nfs/data
5.3 安全配置
在企业环境中,安全性是首要考虑的问题。以下是一些关键的安全配置:
- 身份认证与授权:使用Kubernetes的Role-Based Access Control(RBAC)进行细粒度的权限管理。
- 网络策略:通过Network Policy限制容器之间的通信,防止未经授权的访问。
- 秘密管理:使用Kubernetes Secrets或外部秘密管理工具(如HashiCorp Vault)管理敏感数据。
以下是配置RBAC的示例:
# 配置RBAC角色
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: admin-role
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["*"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-binding
roleRef:
name: admin-role
kind: ClusterRole
subjects:
- kind: User
name: admin
namespace: default
6. 集群扩展与高可用性
6.1 扩展集群
随着业务的增长,集群需要扩展以满足更高的计算需求。以下是扩展集群的步骤:
- 添加新的Worker节点:在新的服务器上安装Docker Engine或Kubernetes组件,并加入现有集群。
- 调整资源分配:根据新的节点资源,调整容器的资源限制和调度策略。
6.2 高可用性配置
为了确保集群的高可用性,可以采取以下措施:
- 多Master节点:在Kubernetes中,通过运行多个Master节点来实现控制平面的高可用性。
- 负载均衡:在Swarm或Kubernetes中,使用负载均衡器分发流量,避免单点故障。
以下是配置Kubernetes多Master节点的示例:
# 初始化多Master节点集群
sudo kubeadm init --apiserver-advertise-address=<master1-ip> --pod-network-cidr=10.244.0.0/16 --control-plane-endpoint=<load-balancer-ip>:6443
7. 集群监控与日志管理
7.1 监控系统
监控是确保集群健康运行的重要手段。以下是常用的监控工具:
- Prometheus:开源监控和警报工具,支持多种数据源。
- Grafana:可视化工具,用于展示监控数据。
以下是配置Prometheus的示例:
# 配置Prometheus部署
apiVersion: apps/v1
kind: Deployment
metadata:
name: prometheus
spec:
replicas: 1
selector:
matchLabels:
app: prometheus
template:
metadata:
labels:
app: prometheus
spec:
containers:
- name: prometheus
image: prom/prometheus:latest
volumeMounts:
- name: prometheus-config
mountPath: /etc/prometheus/prometheus.yml
ports:
- containerPort: 9090
volumes:
- name: prometheus-config
configMap:
name: prometheus-config
7.2 日志管理
日志管理是排查问题和优化应用的重要手段。以下是常用的日志管理工具:
- ELK Stack:包括Elasticsearch、Logstash和Kibana,支持日志的收集、存储和可视化。
- Fluentd:轻量级日志收集工具,支持多种输出目标。
以下是配置Fluentd的示例:
# 配置Fluentd部署
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
spec:
selector:
matchLabels:
app: fluentd
template:
metadata:
labels:
app: fluentd
spec:
containers:
- name: fluentd
image: fluent/fluentd-kubernetes-daemonset:v1-debian-elasticsearch
volumeMounts:
- name: logs
mountPath: /var/log
- name: docker-sock
mountPath: /var/run/docker.sock
volumes:
- name: logs
hostPath:
path: /var/log
- name: docker-sock
hostPath:
path: /var/run/docker.sock