活动公告

系统通知
05-18 21:22
系统通知
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,资源失效请在帖子内回复要求补档,会尽快处理!
10-23 09:31

CentOS Stream容器运行环境配置实战步骤详解与常见问题解决从环境准备到服务启动手把手教你构建稳定高效的容器平台

SunJu_FaceMall

3万

主题

2860

科技点

3万

积分

白金月票

碾压王

积分
32872

塔罗立华奏

<font color=白金月票" /> 发表于 2025-9-12 21:20:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
引言

CentOS Stream作为RHEL的上游开发平台,为企业提供了一个稳定且先进的Linux发行版选择。在当今的云原生时代,容器技术已成为应用部署和管理的标准方式。本文将详细介绍如何在CentOS Stream上构建一个稳定高效的容器运行环境,从基础环境准备到服务启动的全过程,并针对常见问题提供解决方案,帮助读者构建自己的容器平台。

环境准备

系统要求

在开始配置CentOS Stream容器环境之前,需要确保系统满足以下最低要求:

• CPU:64位架构,至少2核心
• 内存:至少4GB RAM(推荐8GB或以上)
• 存储:至少20GB可用磁盘空间
• 网络:稳定的互联网连接,用于下载软件包和更新

安装CentOS Stream

首先,需要下载并安装CentOS Stream系统。可以通过以下步骤完成:

1. 访问CentOS Stream官方网站下载最新的ISO镜像文件。
2. 创建启动介质(如USB启动盘)。
3. 从启动介质引导系统并按照安装向导进行安装。

安装完成后,首次登录系统并更新系统软件包:
  1. sudo dnf update -y
  2. sudo reboot
复制代码

系统基础配置

为系统设置一个合适的主机名,便于识别和管理:
  1. sudo hostnamectl set-hostname container-node01
复制代码

确保网络配置正确,可以使用以下命令查看网络状态:
  1. nmcli connection show
  2. ip addr show
复制代码

如果需要配置静态IP地址,可以编辑网络配置文件:
  1. sudo nmcli connection modify "Wired connection 1" ipv4.method manual ipv4.addresses 192.168.1.100/24 ipv4.gateway 192.168.1.1 ipv4.dns "8.8.8.8 8.8.4.4"
  2. sudo nmcli connection up "Wired connection 1"
复制代码

CentOS Stream默认使用firewalld作为防火墙管理工具。根据容器环境需求,可能需要开放特定端口:
  1. sudo firewall-cmd --permanent --add-port=80/tcp
  2. sudo firewall-cmd --permanent --add-port=443/tcp
  3. sudo firewall-cmd --reload
复制代码

SELinux是CentOS Stream中的安全模块,对于容器环境,建议保持开启状态,但可能需要调整策略:
  1. sudo setenforce 1
  2. sudo sed -i 's/^SELINUX=.*/SELINUX=enforcing/g' /etc/selinux/config
复制代码

容器运行时安装

在CentOS Stream上,可以选择多种容器运行时,包括Docker、Podman和CRI-O等。下面将分别介绍这些运行时的安装方法。

Docker安装

Docker是最流行的容器平台之一,可以通过以下步骤在CentOS Stream上安装:

1. 安装必要的软件包:
  1. sudo dnf install -y dnf-utils device-mapper-persistent-data lvm2
复制代码

1. 添加Docker仓库:
  1. sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
复制代码

1. 安装Docker引擎:
  1. sudo dnf install -y docker-ce docker-ce-cli containerd.io
复制代码

1. 启动并启用Docker服务:
  1. sudo systemctl start docker
  2. sudo systemctl enable docker
复制代码

1. 验证Docker安装:
  1. sudo docker run hello-world
复制代码

Podman安装

Podman是一个无守护进程的容器引擎,与Docker CLI兼容,是CentOS Stream的默认容器工具:

1. 安装Podman:
  1. sudo dnf install -y podman
复制代码

1. 验证Podman安装:
  1. podman run hello-world
复制代码

CRI-O安装

CRI-O是一个轻量级的容器运行时,专为Kubernetes设计:

1. 添加CRI-O仓库:
  1. sudo curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/CentOS_8/devel:kubic:libcontainers:stable.repo
  2. sudo curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable:cri-o:1.20.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:1.20/CentOS_8/devel:kubic:libcontainers:stable:cri-o:1.20.repo
复制代码

1. 安装CRI-O:
  1. sudo dnf install -y cri-o
复制代码

1. 启动并启用CRI-O服务:
  1. sudo systemctl start crio
  2. sudo systemctl enable crio
复制代码

Kubernetes集群部署

如果需要构建完整的容器平台,可以考虑部署Kubernetes集群。以下是单节点Kubernetes集群的部署步骤:

安装Kubernetes工具

1. 添加Kubernetes仓库:
  1. cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
  2. [kubernetes]
  3. name=Kubernetes
  4. baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
  5. enabled=1
  6. gpgcheck=1
  7. repo_gpgcheck=1
  8. gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
  9. exclude=kubelet kubeadm kubectl
  10. EOF
复制代码

1. 安装Kubernetes组件:
  1. sudo dnf install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
复制代码

1. 启动并启用kubelet服务:
  1. sudo systemctl enable --now kubelet
复制代码

初始化Kubernetes集群

1. 初始化控制平面节点:
  1. sudo kubeadm init --pod-network-cidr=10.244.0.0/16
复制代码

1. 配置kubectl:
  1. mkdir -p $HOME/.kube
  2. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  3. sudo chown $(id -u):$(id -g) $HOME/.kube/config
复制代码

1. 安装Pod网络插件(以Flannel为例):
  1. kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
复制代码

1. 允许控制平面节点调度Pod(仅适用于单节点集群):
  1. kubectl taint nodes --all node-role.kubernetes.io/master-
复制代码

容器编排工具配置

Docker Compose安装

Docker Compose是用于定义和运行多容器Docker应用程序的工具:

1. 下载Docker Compose二进制文件:
  1. sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
复制代码

1. 添加执行权限:
  1. sudo chmod +x /usr/local/bin/docker-compose
复制代码

1. 创建软链接:
  1. sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
复制代码

1. 验证安装:
  1. docker-compose --version
复制代码

Podman Compose安装

Podman Compose是Podman的替代方案,用于管理多容器应用:

1. 安装Python和pip:
  1. sudo dnf install -y python3 python3-pip
复制代码

1. 安装Podman Compose:
  1. pip3 install podman-compose
复制代码

1. 验证安装:
  1. podman-compose --version
复制代码

网络配置

容器网络基础

容器网络是容器平台的重要组成部分,它允许容器之间以及容器与外部网络进行通信。在CentOS Stream上,可以使用多种网络解决方案:

1. 查看Docker网络:
  1. sudo docker network ls
复制代码

1. 创建自定义网络:
  1. sudo docker network create --driver bridge my-network
复制代码

1. 运行容器并连接到自定义网络:
  1. sudo docker run -d --name nginx --network my-network nginx
复制代码

1. 查看Podman网络:
  1. podman network ls
复制代码

1. 创建自定义网络:
  1. podman network create my-network
复制代码

1. 运行容器并连接到自定义网络:
  1. podman run -d --name nginx --network my-network nginx
复制代码

高级网络配置

对于多主机容器环境,可以使用以下解决方案:

1. Flannel:一个简单的覆盖网络,专为Kubernetes设计。
2. Calico:提供网络策略和安全性。
3. Weave Net:创建虚拟网络,连接部署在多个主机上的Docker容器。

Flannel:一个简单的覆盖网络,专为Kubernetes设计。

Calico:提供网络策略和安全性。

Weave Net:创建虚拟网络,连接部署在多个主机上的Docker容器。

以Flannel为例,安装步骤如下:

1. 下载Flannel配置文件:
  1. wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
复制代码

1. 应用配置:
  1. kubectl apply -f kube-flannel.yml
复制代码

网络策略允许控制Pod之间的流量:
  1. apiVersion: networking.k8s.io/v1
  2. kind: NetworkPolicy
  3. metadata:
  4.   name: test-network-policy
  5.   namespace: default
  6. spec:
  7.   podSelector: {}
  8.   policyTypes:
  9.   - Ingress
  10.   - Egress
  11.   ingress:
  12.   - from:
  13.     - ipBlock:
  14.         cidr: 172.17.0.0/16
  15.         except:
  16.         - 172.17.1.0/24
  17.     - namespaceSelector:
  18.         matchLabels:
  19.           project: myproject
  20.     - podSelector:
  21.         matchLabels:
  22.           role: frontend
  23.     ports:
  24.     - protocol: TCP
  25.       port: 6379
  26.   egress:
  27.   - to:
  28.     - ipBlock:
  29.         cidr: 10.0.0.0/24
  30.     ports:
  31.     - protocol: TCP
  32.       port: 5978
复制代码

存储配置

持久化存储概述

容器本身是无状态的,但许多应用程序需要持久化存储。在CentOS Stream容器环境中,可以使用多种存储解决方案:

Docker存储配置

1. 查看Docker存储信息:
  1. sudo docker info | grep "Storage Driver"
复制代码

1. 创建数据卷:
  1. sudo docker volume create my-volume
复制代码

1. 挂载数据卷到容器:
  1. sudo docker run -d -v my-volume:/app/data nginx
复制代码

1. 挂载主机目录到容器:
  1. sudo docker run -d -v /host/path:/container/path nginx
复制代码

Podman存储配置

1. 查看Podman存储信息:
  1. podman info | grep "graphRoot"
复制代码

1. 创建数据卷:
  1. podman volume create my-volume
复制代码

1. 挂载数据卷到容器:
  1. podman run -d -v my-volume:/app/data nginx
复制代码

1. 挂载主机目录到容器:
  1. podman run -d -v /host/path:/container/path nginx
复制代码

Kubernetes持久化存储

在Kubernetes中,可以使用PersistentVolume和PersistentVolumeClaim来管理持久化存储:

1. 创建PersistentVolume:
  1. apiVersion: v1
  2. kind: PersistentVolume
  3. metadata:
  4.   name: my-pv
  5. spec:
  6.   capacity:
  7.     storage: 5Gi
  8.   volumeMode: Filesystem
  9.   accessModes:
  10.     - ReadWriteOnce
  11.   persistentVolumeReclaimPolicy: Retain
  12.   storageClassName: manual
  13.   hostPath:
  14.     path: /mnt/data
复制代码

1. 创建PersistentVolumeClaim:
  1. apiVersion: v1
  2. kind: PersistentVolumeClaim
  3. metadata:
  4.   name: my-pvc
  5. spec:
  6.   accessModes:
  7.     - ReadWriteOnce
  8.   volumeMode: Filesystem
  9.   resources:
  10.     requests:
  11.       storage: 5Gi
  12.   storageClassName: manual
复制代码

1. 在Pod中使用PVC:
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: my-pod
  5. spec:
  6.   containers:
  7.     - name: my-container
  8.       image: nginx
  9.       volumeMounts:
  10.         - mountPath: "/usr/share/nginx/html"
  11.           name: my-storage
  12.   volumes:
  13.     - name: my-storage
  14.       persistentVolumeClaim:
  15.         claimName: my-pvc
复制代码

高级存储解决方案

对于生产环境,可以考虑以下高级存储解决方案:

1. Ceph:分布式存储系统,提供块、对象和文件存储。
2. GlusterFS:可扩展的网络文件系统。
3. NFS:网络文件系统,适合共享存储。

Ceph:分布式存储系统,提供块、对象和文件存储。

GlusterFS:可扩展的网络文件系统。

NFS:网络文件系统,适合共享存储。

以NFS为例,配置步骤如下:

1. 安装NFS服务器:
  1. sudo dnf install -y nfs-utils
复制代码

1. 创建共享目录:
  1. sudo mkdir -p /nfs/share
  2. sudo chmod 777 /nfs/share
复制代码

1. 配置NFS导出:
  1. echo "/nfs/share *(rw,sync,no_root_squash)" | sudo tee -a /etc/exports
复制代码

1. 启动NFS服务:
  1. sudo systemctl enable --now nfs-server
复制代码

1. 在客户端挂载NFS共享:
  1. sudo dnf install -y nfs-utils
  2. sudo mkdir -p /mnt/nfs
  3. sudo mount -t nfs <nfs-server-ip>:/nfs/share /mnt/nfs
复制代码

安全设置

容器安全基础

容器安全是容器平台的重要组成部分,需要从多个层面进行保护:

1. 使用非root用户运行容器:
  1. # Dockerfile示例
  2. FROM alpine
  3. RUN addgroup -g 1001 -S appgroup && \
  4.     adduser -u 1001 -S appuser -G appgroup
  5. USER appuser
复制代码

1. 限制容器能力:
  1. sudo docker run --cap-drop ALL --cap-add NET_BIND_SERVICE nginx
复制代码

1. 使用只读根文件系统:
  1. sudo docker run --read-only nginx
复制代码

1. 使用官方镜像或可信来源的镜像。
2. 定期扫描镜像漏洞:

使用官方镜像或可信来源的镜像。

定期扫描镜像漏洞:
  1. sudo dnf install -y clamav
  2. freshclam
  3. clamscan --infected --remove --recursive /var/lib/docker
复制代码

1. 使用多阶段构建减少镜像大小和攻击面:
  1. # 构建阶段
  2. FROM golang:1.16 AS builder
  3. WORKDIR /app
  4. COPY . .
  5. RUN go build -o myapp .
  6. # 运行阶段
  7. FROM alpine:latest
  8. WORKDIR /app
  9. COPY --from=builder /app/myapp .
  10. CMD ["./myapp"]
复制代码

网络安全

1. 使用网络隔离:
  1. sudo docker network create --internal isolated-network
复制代码

1. 限制容器端口暴露:
  1. sudo docker run -p 127.0.0.1:8080:80 nginx
复制代码

1. 使用TLS加密通信:
  1. sudo docker run -d \
  2.   --name registry \
  3.   -v /path/to/certs:/certs \
  4.   -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
  5.   -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  6.   -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  7.   -p 443:443 \
  8.   registry:2
复制代码

Kubernetes安全

1. 使用RBAC控制访问:
  1. apiVersion: v1
  2. kind: ServiceAccount
  3. metadata:
  4.   name: my-service-account
  5. ---
  6. apiVersion: rbac.authorization.k8s.io/v1
  7. kind: Role
  8. metadata:
  9.   name: my-role
  10. rules:
  11. - apiGroups: [""]
  12.   resources: ["pods"]
  13.   verbs: ["get", "list", "watch"]
  14. ---
  15. apiVersion: rbac.authorization.k8s.io/v1
  16. kind: RoleBinding
  17. metadata:
  18.   name: my-role-binding
  19. subjects:
  20. - kind: ServiceAccount
  21.   name: my-service-account
  22. roleRef:
  23.   kind: Role
  24.   name: my-role
  25.   apiGroup: rbac.authorization.k8s.io
复制代码

1. 使用Pod Security Policies:
  1. apiVersion: policy/v1beta1
  2. kind: PodSecurityPolicy
  3. metadata:
  4.   name: my-psp
  5. spec:
  6.   privileged: false
  7.   allowPrivilegeEscalation: false
  8.   requiredDropCapabilities:
  9.     - ALL
  10.   volumes:
  11.     - 'configMap'
  12.     - 'emptyDir'
  13.     - 'projected'
  14.     - 'secret'
  15.     - 'downwardAPI'
  16.     - 'persistentVolumeClaim'
  17.   runAsUser:
  18.     rule: 'MustRunAsNonRoot'
  19.   seLinux:
  20.     rule: 'RunAsAny'
  21.   fsGroup:
  22.     rule: 'RunAsAny'
复制代码

1. 使用网络策略:
  1. apiVersion: networking.k8s.io/v1
  2. kind: NetworkPolicy
  3. metadata:
  4.   name: my-network-policy
  5. spec:
  6.   podSelector: {}
  7.   policyTypes:
  8.   - Ingress
  9.   - Egress
  10.   ingress:
  11.   - from:
  12.     - namespaceSelector:
  13.         matchLabels:
  14.           project: myproject
  15.     ports:
  16.     - protocol: TCP
  17.       port: 80
复制代码

服务启动与管理

容器服务管理

1. 启动容器:
  1. sudo docker run -d --name my-nginx -p 80:80 nginx
复制代码

1. 停止容器:
  1. sudo docker stop my-nginx
复制代码

1. 重启容器:
  1. sudo docker restart my-nginx
复制代码

1. 查看容器日志:
  1. sudo docker logs my-nginx
复制代码

1. 进入容器:
  1. sudo docker exec -it my-nginx /bin/bash
复制代码

1. 启动容器:
  1. podman run -d --name my-nginx -p 80:80 nginx
复制代码

1. 停止容器:
  1. podman stop my-nginx
复制代码

1. 重启容器:
  1. podman restart my-nginx
复制代码

1. 查看容器日志:
  1. podman logs my-nginx
复制代码

1. 进入容器:
  1. podman exec -it my-nginx /bin/bash
复制代码

使用systemd管理容器

可以使用systemd来管理容器,使其在系统启动时自动启动:

1. 创建systemd服务文件:
  1. sudo tee /etc/systemd/system/nginx-container.service > /dev/null <<EOL
  2. [Unit]
  3. Description=Nginx Container
  4. After=docker.service
  5. Requires=docker.service
  6. [Service]
  7. Restart=always
  8. ExecStart=/usr/bin/docker run -p 80:80 --name nginx nginx
  9. ExecStop=/usr/bin/docker stop -t 2 nginx
  10. ExecStopPost=/usr/bin/docker rm -f nginx
  11. [Install]
  12. WantedBy=multi-user.target
  13. EOL
复制代码

1. 重新加载systemd配置:
  1. sudo systemctl daemon-reload
复制代码

1. 启动并启用服务:
  1. sudo systemctl start nginx-container
  2. sudo systemctl enable nginx-container
复制代码

Kubernetes服务管理

1. 创建Deployment:
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: nginx-deployment
  5. spec:
  6.   replicas: 3
  7.   selector:
  8.     matchLabels:
  9.       app: nginx
  10.   template:
  11.     metadata:
  12.       labels:
  13.         app: nginx
  14.     spec:
  15.       containers:
  16.       - name: nginx
  17.         image: nginx:1.14.2
  18.         ports:
  19.         - containerPort: 80
复制代码

1. 创建Service:
  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4.   name: nginx-service
  5. spec:
  6.   selector:
  7.     app: nginx
  8.   ports:
  9.     - protocol: TCP
  10.       port: 80
  11.       targetPort: 80
  12.   type: LoadBalancer
复制代码

1. 应用配置:
  1. kubectl apply -f nginx-deployment.yaml
  2. kubectl apply -f nginx-service.yaml
复制代码

1. 查看服务状态:
  1. kubectl get deployments
  2. kubectl get services
  3. kubectl get pods
复制代码

常见问题及解决方案

容器启动失败

解决方案:

1. 查看端口占用情况:
  1. sudo netstat -tlnp | grep :80
复制代码

1. 停止占用端口的进程或更改容器端口映射:
  1. sudo docker run -d --name my-nginx -p 8080:80 nginx
复制代码

解决方案:

1. 查看容器日志:
  1. sudo docker logs my-container
复制代码

1. 确保容器有前台进程运行:
  1. # Dockerfile示例
  2. FROM alpine
  3. CMD ["tail", "-f", "/dev/null"]
复制代码

1. 交互式运行容器进行调试:
  1. sudo docker run -it --entrypoint /bin/sh my-image
复制代码

网络连接问题

解决方案:

1. 检查防火墙设置:
  1. sudo firewall-cmd --list-all
复制代码

1. 添加必要的防火墙规则:
  1. sudo firewall-cmd --permanent --add-masquerade
  2. sudo firewall-cmd --reload
复制代码

1. 检查Docker网络配置:
  1. sudo docker network inspect bridge
复制代码

解决方案:

1. 确保容器在同一网络中:
  1. sudo docker network create my-network
  2. sudo docker run -d --name container1 --network my-network my-image
  3. sudo docker run -d --name container2 --network my-network my-image
复制代码

1. 使用容器名称进行通信:
  1. sudo docker exec -it container1 ping container2
复制代码

存储问题

解决方案:

1. 检查主机目录是否存在:
  1. ls -la /host/path
复制代码

1. 确保目录权限正确:
  1. sudo chmod 755 /host/path
复制代码

1. 检查SELinux设置:
  1. sudo chcon -Rt svirt_sandbox_file_t /host/path
复制代码

解决方案:

1. 确保正确使用数据卷:
  1. sudo docker run -d -v my-volume:/app/data my-image
复制代码

1. 定期备份数据卷:
  1. sudo docker run --rm -v my-volume:/source -v $(pwd):/backup alpine tar cvf /backup/my-volume-backup.tar /source
复制代码

性能问题

解决方案:

1. 检查资源使用情况:
  1. sudo docker stats
复制代码

1. 限制容器资源使用:
  1. sudo docker run -d --memory="512m" --cpus="1.0" my-image
复制代码

1. 优化镜像大小:
  1. # 使用多阶段构建
  2. FROM golang:1.16 AS builder
  3. WORKDIR /app
  4. COPY . .
  5. RUN go build -o myapp .
  6. FROM alpine:latest
  7. WORKDIR /app
  8. COPY --from=builder /app/myapp .
  9. CMD ["./myapp"]
复制代码

解决方案:

1. 清理未使用的Docker资源:
  1. sudo docker system prune -a
复制代码

1. 更改Docker存储位置:
  1. sudo systemctl stop docker
  2. sudo mkdir -p /new/docker/path
  3. sudo rsync -avP /var/lib/docker/ /new/docker/path
  4. sudo vi /etc/docker/daemon.json
复制代码

在daemon.json中添加:
  1. {
  2.   "data-root": "/new/docker/path"
  3. }
复制代码

然后重启Docker服务:
  1. sudo systemctl start docker
复制代码

Kubernetes问题

解决方案:

1. 检查Pod事件:
  1. kubectl describe pod <pod-name>
复制代码

1. 检查节点资源:
  1. kubectl describe nodes
复制代码

1. 检查PVC状态(如果使用持久化存储):
  1. kubectl get pvc
复制代码

解决方案:

1. 查看Pod日志:
  1. kubectl logs <pod-name>
  2. kubectl logs <pod-name> --previous
复制代码

1. 检查Pod状态:
  1. kubectl describe pod <pod-name>
复制代码

1. 检查资源限制:
  1. kubectl get pod <pod-name> -o yaml | grep -A 10 resources
复制代码

性能优化

容器性能优化

1. 使用多阶段构建减少镜像大小:
  1. # 构建阶段
  2. FROM golang:1.16 AS builder
  3. WORKDIR /app
  4. COPY . .
  5. RUN go build -o myapp .
  6. # 运行阶段
  7. FROM alpine:latest
  8. WORKDIR /app
  9. COPY --from=builder /app/myapp .
  10. CMD ["./myapp"]
复制代码

1. 使用轻量级基础镜像:
  1. # 使用alpine代替ubuntu
  2. FROM alpine:latest
  3. RUN apk add --no-cache nginx
  4. CMD ["nginx", "-g", "daemon off;"]
复制代码

1. 合并RUN指令减少层数:
  1. # 不推荐
  2. FROM alpine
  3. RUN apk add --no-cache curl
  4. RUN apk add --no-cache wget
  5. RUN apk add --no-cache git
  6. # 推荐
  7. FROM alpine
  8. RUN apk add --no-cache curl wget git
复制代码

1. 设置CPU和内存限制:
  1. sudo docker run -d --memory="512m" --cpus="1.0" my-image
复制代码

1. 在Kubernetes中设置资源限制:
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: my-pod
  5. spec:
  6.   containers:
  7.   - name: my-container
  8.     image: my-image
  9.     resources:
  10.       requests:
  11.         memory: "64Mi"
  12.         cpu: "250m"
  13.       limits:
  14.         memory: "128Mi"
  15.         cpu: "500m"
复制代码

系统性能优化

1. 调整内核参数:
  1. # 编辑sysctl配置
  2. sudo tee -a /etc/sysctl.conf > /dev/null <<EOL
  3. # 增加文件描述符限制
  4. fs.file-max = 100000
  5. # 优化网络参数
  6. net.core.rmem_max = 16777216
  7. net.core.wmem_max = 16777216
  8. net.ipv4.tcp_rmem = 4096 87380 16777216
  9. net.ipv4.tcp_wmem = 4096 65536 16777216
  10. net.ipv4.tcp_fin_timeout = 30
  11. net.ipv4.tcp_keepalive_time = 120
  12. net.ipv4.ip_local_port_range = 10000 65000
  13. EOL
复制代码

1. 应用配置:
  1. sudo sysctl -p
复制代码

1. 使用高性能存储:
  1. # 使用SSD存储
  2. sudo mkfs.ext4 /dev/sdb
  3. sudo mount /dev/sdb /var/lib/docker
复制代码

1. 调整文件系统参数:
  1. # 添加noatime选项减少磁盘I/O
  2. sudo vi /etc/fstab
复制代码

在/etc/fstab中添加noatime选项:
  1. /dev/sdb /var/lib/docker ext4 defaults,noatime 0 0
复制代码

然后重新挂载:
  1. sudo mount -o remount /var/lib/docker
复制代码

网络性能优化

1. 使用高性能网络插件:
  1. # 安装Calico网络插件
  2. kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
复制代码

1. 优化网络参数:
  1. # 编辑网络配置
  2. sudo tee -a /etc/sysctl.conf > /dev/null <<EOL
  3. # 优化网络性能
  4. net.core.netdev_max_backlog = 5000
  5. net.ipv4.tcp_congestion_control = bbr
  6. net.ipv4.tcp_fastopen = 3
  7. EOL
复制代码

1. 应用配置:
  1. sudo sysctl -p
复制代码

1. 使用高效的负载均衡器:
  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4.   name: my-service
  5. spec:
  6.   selector:
  7.     app: my-app
  8.   ports:
  9.     - protocol: TCP
  10.       port: 80
  11.       targetPort: 8080
  12.   type: LoadBalancer
  13.   externalTrafficPolicy: Local
复制代码

1. 配置HPA(Horizontal Pod Autoscaler):
  1. apiVersion: autoscaling/v2beta2
  2. kind: HorizontalPodAutoscaler
  3. metadata:
  4.   name: my-hpa
  5. spec:
  6.   scaleTargetRef:
  7.     apiVersion: apps/v1
  8.     kind: Deployment
  9.     name: my-deployment
  10.   minReplicas: 1
  11.   maxReplicas: 10
  12.   metrics:
  13.   - type: Resource
  14.     resource:
  15.       name: cpu
  16.       target:
  17.         type: Utilization
  18.         averageUtilization: 50
复制代码

监控与日志

容器监控

1. 部署Prometheus:
  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4.   name: prometheus-config
  5. data:
  6.   prometheus.yml: |
  7.     global:
  8.       scrape_interval: 15s
  9.     scrape_configs:
  10.     - job_name: 'kubernetes-pods'
  11.       kubernetes_sd_configs:
  12.       - role: pod
  13. ---
  14. apiVersion: apps/v1
  15. kind: Deployment
  16. metadata:
  17.   name: prometheus
  18. spec:
  19.   replicas: 1
  20.   selector:
  21.     matchLabels:
  22.       app: prometheus
  23.   template:
  24.     metadata:
  25.       labels:
  26.         app: prometheus
  27.     spec:
  28.       containers:
  29.       - name: prometheus
  30.         image: prom/prometheus:latest
  31.         ports:
  32.         - containerPort: 9090
  33.         volumeMounts:
  34.         - name: config-volume
  35.           mountPath: /etc/prometheus
  36.       volumes:
  37.       - name: config-volume
  38.         configMap:
  39.           name: prometheus-config
复制代码

1. 部署Grafana:
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: grafana
  5. spec:
  6.   replicas: 1
  7.   selector:
  8.     matchLabels:
  9.       app: grafana
  10.   template:
  11.     metadata:
  12.       labels:
  13.         app: grafana
  14.     spec:
  15.       containers:
  16.       - name: grafana
  17.         image: grafana/grafana:latest
  18.         ports:
  19.         - containerPort: 3000
  20.         env:
  21.         - name: GF_SECURITY_ADMIN_PASSWORD
  22.           value: "admin"
  23. ---
  24. apiVersion: v1
  25. kind: Service
  26. metadata:
  27.   name: grafana
  28. spec:
  29.   selector:
  30.     app: grafana
  31.   ports:
  32.     - protocol: TCP
  33.       port: 80
  34.       targetPort: 3000
  35.   type: LoadBalancer
复制代码

cAdvisor是Google开发的容器资源监控工具:
  1. # 运行cAdvisor
  2. sudo docker run \
  3.   --volume=/:/rootfs:ro \
  4.   --volume=/var/run:/var/run:ro \
  5.   --volume=/sys:/sys:ro \
  6.   --volume=/var/lib/docker/:/var/lib/docker:ro \
  7.   --publish=8080:8080 \
  8.   --detach=true \
  9.   --name=cadvisor \
  10.   google/cadvisor:latest
复制代码

日志管理

1. 部署Elasticsearch:
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: elasticsearch
  5. spec:
  6.   replicas: 1
  7.   selector:
  8.     matchLabels:
  9.       app: elasticsearch
  10.   template:
  11.     metadata:
  12.       labels:
  13.         app: elasticsearch
  14.     spec:
  15.       containers:
  16.       - name: elasticsearch
  17.         image: elasticsearch:7.10.1
  18.         env:
  19.         - name: discovery.type
  20.           value: single-node
  21.         ports:
  22.         - containerPort: 9200
  23. ---
  24. apiVersion: v1
  25. kind: Service
  26. metadata:
  27.   name: elasticsearch
  28. spec:
  29.   selector:
  30.     app: elasticsearch
  31.   ports:
  32.     - protocol: TCP
  33.       port: 9200
  34.       targetPort: 9200
复制代码

1. 部署Kibana:
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: kibana
  5. spec:
  6.   replicas: 1
  7.   selector:
  8.     matchLabels:
  9.       app: kibana
  10.   template:
  11.     metadata:
  12.       labels:
  13.         app: kibana
  14.     spec:
  15.       containers:
  16.       - name: kibana
  17.         image: kibana:7.10.1
  18.         env:
  19.         - name: ELASTICSEARCH_HOSTS
  20.           value: http://elasticsearch:9200
  21.         ports:
  22.         - containerPort: 5601
  23. ---
  24. apiVersion: v1
  25. kind: Service
  26. metadata:
  27.   name: kibana
  28. spec:
  29.   selector:
  30.     app: kibana
  31.   ports:
  32.     - protocol: TCP
  33.       port: 5601
  34.       targetPort: 5601
  35.   type: LoadBalancer
复制代码

1. 部署Filebeat:
  1. apiVersion: apps/v1
  2. kind: DaemonSet
  3. metadata:
  4.   name: filebeat
  5. spec:
  6.   selector:
  7.     matchLabels:
  8.       app: filebeat
  9.   template:
  10.     metadata:
  11.       labels:
  12.         app: filebeat
  13.     spec:
  14.       containers:
  15.       - name: filebeat
  16.         image: elastic/filebeat:7.10.1
  17.         volumeMounts:
  18.         - name: varlog
  19.           mountPath: /var/log
  20.         - name: varlibdockercontainers
  21.           mountPath: /var/lib/docker/containers
  22.       volumes:
  23.       - name: varlog
  24.         hostPath:
  25.           path: /var/log
  26.       - name: varlibdockercontainers
  27.         hostPath:
  28.           path: /var/lib/docker/containers
复制代码

Fluentd是另一个流行的日志收集工具:
  1. apiVersion: apps/v1
  2. kind: DaemonSet
  3. metadata:
  4.   name: fluentd
  5. spec:
  6.   selector:
  7.     matchLabels:
  8.       app: fluentd
  9.   template:
  10.     metadata:
  11.       labels:
  12.         app: fluentd
  13.     spec:
  14.       containers:
  15.       - name: fluentd
  16.         image: fluent/fluentd:v1.12-1
  17.         volumeMounts:
  18.         - name: varlog
  19.           mountPath: /var/log
  20.         - name: varlibdockercontainers
  21.           mountPath: /var/lib/docker/containers
  22.         - name: config-volume
  23.           mountPath: /fluentd/etc
  24.       volumes:
  25.       - name: varlog
  26.         hostPath:
  27.           path: /var/log
  28.       - name: varlibdockercontainers
  29.         hostPath:
  30.           path: /var/lib/docker/containers
  31.       - name: config-volume
  32.         configMap:
  33.           name: fluentd-config
  34. ---
  35. apiVersion: v1
  36. kind: ConfigMap
  37. metadata:
  38.   name: fluentd-config
  39. data:
  40.   fluent.conf: |
  41.     <source>
  42.       @type tail
  43.       path /var/log/containers/*.log
  44.       pos_file /var/log/fluentd-containers.log.pos
  45.       tag kubernetes.*
  46.       format json
  47.       time_format %Y-%m-%dT%H:%M:%S.%NZ
  48.     </source>
  49.    
  50.     <match kubernetes.**>
  51.       @type elasticsearch
  52.       host elasticsearch
  53.       port 9200
  54.       index_name fluentd
  55.       type_name _doc
  56.     </match>
复制代码

总结

本文详细介绍了在CentOS Stream上构建容器运行环境的完整流程,从环境准备到服务启动的全过程。我们涵盖了以下关键方面:

1. 环境准备:详细介绍了CentOS Stream的系统要求、安装步骤和基础配置。
2. 容器运行时安装:提供了Docker、Podman和CRI-O的安装和配置方法。
3. Kubernetes集群部署:介绍了如何部署单节点Kubernetes集群。
4. 容器编排工具配置:提供了Docker Compose和Podman Compose的安装和使用方法。
5. 网络配置:详细介绍了容器网络的基础知识和高级配置。
6. 存储配置:涵盖了持久化存储的各种方案,包括本地存储、NFS和分布式存储。
7. 安全设置:从容器运行时、镜像、网络和Kubernetes等多个层面介绍了安全配置。
8. 服务启动与管理:提供了容器服务和Kubernetes服务的管理方法。
9. 常见问题及解决方案:针对容器启动失败、网络连接问题、存储问题和性能问题提供了详细的解决方案。
10. 性能优化:从镜像优化、资源限制、内核参数调优、存储性能优化和网络性能优化等方面提供了性能优化建议。
11. 监控与日志:介绍了使用Prometheus、Grafana、ELK Stack和Fluentd等工具进行监控和日志管理的方法。

环境准备:详细介绍了CentOS Stream的系统要求、安装步骤和基础配置。

容器运行时安装:提供了Docker、Podman和CRI-O的安装和配置方法。

Kubernetes集群部署:介绍了如何部署单节点Kubernetes集群。

容器编排工具配置:提供了Docker Compose和Podman Compose的安装和使用方法。

网络配置:详细介绍了容器网络的基础知识和高级配置。

存储配置:涵盖了持久化存储的各种方案,包括本地存储、NFS和分布式存储。

安全设置:从容器运行时、镜像、网络和Kubernetes等多个层面介绍了安全配置。

服务启动与管理:提供了容器服务和Kubernetes服务的管理方法。

常见问题及解决方案:针对容器启动失败、网络连接问题、存储问题和性能问题提供了详细的解决方案。

性能优化:从镜像优化、资源限制、内核参数调优、存储性能优化和网络性能优化等方面提供了性能优化建议。

监控与日志:介绍了使用Prometheus、Grafana、ELK Stack和Fluentd等工具进行监控和日志管理的方法。

通过遵循本文提供的步骤和建议,您可以在CentOS Stream上构建一个稳定、高效、安全的容器平台,为您的应用提供强大的运行环境。无论是开发环境、测试环境还是生产环境,这些配置和优化措施都能帮助您充分利用容器技术的优势,提高应用的可靠性和性能。

随着容器技术的不断发展,CentOS Stream作为一个稳定且先进的Linux发行版,为容器化应用提供了理想的基础平台。希望本文能够帮助您成功构建和管理自己的容器环境,为您的业务发展提供强有力的技术支持。
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则