🐳 容器化实战:应用上云
前面搭建好了jenkins和K8s集群,现在我们来编写配置文件
🐳 Dockerfile文件详解
Dockerfile定义了一个构建镜像过程。
各个名词解释:
- FROM :
Dockerfile的第一条指令,用来指定基础镜像。在这里,镜像基于openjdk:17,它是一个包含JDK17的官方Docker镜像。 - ENV:用于设置环境变量。
- RUN:用于在镜像构建时执行命令。
- ADD:用于将文件从宿主机复制到容器中
- WORKDIR: 设置工作目录
- ENTRYPOINT: 定义容器启动时默认执行命令
- EXPOSE: 用于在容器内部声明该容器会监听的网络端口
📄 Kubernetes YAML文件详解
Kubernetes YAML文件包含两个主要部分:一个Deployment和一个Service。
各个名词解释:
- Pod :
K8S中最小调度单元,通常是一个或多个容器的集合,具有共享网络和存储。 - Deployment : 用于管理
Pod的生命周期,包括副本的自动扩缩容、滚动更新和回滚,确保应用程序的高可用性和稳定性。 - Service : 为一组
Pod提供稳定的访问入口,负责负载均衡和服务发现。它通过DNS名称和虚拟IP地址,使得客户端能够访问到对应的Pod。 - apiVersion: 指定资源版本
- metadata :元数据部分;
name指定Deployment的名字,namespace执行Deployment部署的命名空间,label指定Deployment的标签 - spec : 指定
Deployment的详细规格,如:Pod副本数、镜像地址、端口、容器名称、容器可使用资源、凭证等。
👨💻 后端
在release-test根目录添加Dockerfile和k8s-releasetest.yaml两个文件并提交到远程仓库
🐳 Dockerfile
dockerfile
FROM openjdk:17
ENV JAVA_OPTS="--add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.security.jgss/sun.security.krb5=ALL-UNNAMED"
RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
ADD target/release-test-*.jar /data/release-test-0.0.1.jar
WORKDIR /data
ENTRYPOINT ["/bin/sh", "-c", "java ${JAVA_OPTS} -jar release-test-0.0.1.jar"]
EXPOSE 30001
📄 k8s-releasetest.yaml
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: release-test
namespace: $NAMESPACE
labels:
app: release-test
spec:
replicas: 1
selector:
matchLabels:
app: release-test
template:
metadata:
name: release-test
labels:
app: release-test
spec:
containers:
- name: release-test
image: $REGISTRY/$PROJECT/$IMAGENAME:$TAGS
imagePullPolicy: IfNotPresent
ports:
- containerPort: 30001
protocol: TCP
resources:
requests:
memory: "0.5G"
cpu: "0.2"
limits:
memory: "1G"
cpu: "0.5"
imagePullSecrets:
- name: harbor-k8s-secret
restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
name: release-test
namespace: $NAMESPACE
spec:
type: NodePort
ports:
- port: 30001
name: release-test
protocol: TCP
targetPort: 30001
nodePort: 30001
selector:
app: release-test
👩💻 前端
在release-frontend根目录添加Dockerfile和k8s-reelasefrontend.yaml两个文件并提交到远程仓库。
🐳 Dockerfile
dockerfile
FROM nginx:latest
ENV ENV LANG en_US.UTF-8
# 同步时区及时间
RUN ln -snf /usr/share/zoneinfo/Asia/ShangHai /etc/localtime && echo 'Asia/ShangHai' > /etc/timezone
ADD dist/ /data/www/
RUN sed -i 's/#gzip on/gzip on/g' /etc/nginx/nginx.conf
RUN sed -i '/index index.html index.htm/a\ try_files \$uri \$uri/ \/index.html;' /etc/nginx/conf.d/default.conf
RUN sed -i 's|/usr/share/nginx/html|/data/www/|g' /etc/nginx/conf.d/default.conf
WORKDIR /data/www/
ENTRYPOINT [ "nginx", "-g", "daemon off;" ]
EXPOSE 30002
📄 k8s-reelasefrontend.yaml
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: release-frontend
namespace: $NAMESPACE
labels:
app: release-frontend
spec:
replicas: 1
selector:
matchLabels:
app: release-frontend
template:
metadata:
name: release-frontend
labels:
app: release-frontend
spec:
containers:
- name: release-frontend
image: $REGISTRY/$PROJECT/$IMAGENAME:$TAGS
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80 # nginx端口号
protocol: TCP
resources:
requests:
memory: "0.5G"
cpu: "0.2"
limits:
memory: "1G"
cpu: "0.5"
imagePullSecrets:
- name: harbor-k8s-secret
restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
name: release-frontend
namespace: $NAMESPACE
spec:
type: NodePort
ports:
- port: 30002
name: release-frontend
protocol: TCP
targetPort: 80
nodePort: 30002
selector:
app: release-frontend
📝 创建命名空间
🖥️ 机器B中创建
前面的配置文件中可以看到namespace为:$NAMESPACE。
$NAMESPACE变量的值根据不同环境(开发、测试、生产)不同,这里我们以开发环境为例,在k8s集群服务器中执行下面命令:
bash
kubectl create namespace develop
🛠️ 配置 Kubernetes Secret 以访问私有 Harbor
🖥️ 机器B中创建
前面的配置文件中可以看到imagePullSecrets的name为:harbor-k8s-secret, kubelet拉取镜像时需要验证是否有权限拉取。 当没有配时,拉取镜像会报:pull access denied, repository does not exist or may require authorization: authorization failed: no basic auth credentials。
-
创建 Kubernetes Secret : 使用
kubectl create secret docker-registry命令创建Secret,确保提供正确的Harbor服务器地址、用户名和密码。bashkubectl create secret docker-registry harbor-k8s-secret \ --docker-server=https://xxx \ --docker-username=<your-username> \ --docker-password=<your-password> \ --docker-email=<your-email> \ -n develop这个命令会在
develop命名空间下创建一个名为harbor-k8s-secret的Secret。 ⚠️ 注意 :xxx必须和k8s yaml文件中镜像地址一致,如:images: xxx/test:2024110215014382。 -
在 Pod 或 Deployment 中引用 Secret : 在你的
Pod或Deployment的YAML文件中,需要指定imagePullSecrets,以便Kubernetes在拉取镜像时使用该Secret。
🔒 配置服务器安全组规则
k8s所在服务器的ip地址需要添加到harbor(https一般为443端口)所在服务器的安全组规则中jenkins所在服务器的ip地址需要 添加到harbor(https一般为443端口)所在服务器的安全组规则中