kubectl镜像制作

准备

1、kubectl二进制准备

2、Dockerfile文件准备

From alpine:3.10

ARG KUBECTL_VERSION=v1.19.7
ARG TARGETPLATFORM

RUN apk update && apk add \
   bash \
   bash-completion \
   busybox-extras \
   net-tools \
   vim \
   curl \
   wget \
   tcpdump \
   ca-certificates && \
   update-ca-certificates && \
   rm -rf /var/cache/apk/* && \
   echo -e 'source /usr/share/bash-completion/bash_completion\nsource <(kubectl completion bash)' >>~/.bashrc

COPY kubectl /usr/local/bin/kubectl
COPY entrypoint.sh /usr/local/bin/entrypoint.sh

ENTRYPOINT ["entrypoint.sh"]

3、entrypoint.sh文件准备,容器启动程序,是一个循环休眠程序,防止容器退出

#!/bin/bash

set -e

if [ "$1" = '' ]; then
  while true; do sleep 1000; done
fi

exec "$@"

 步骤

1、创建文件夹mkdir -p /dockerfile/kubectl,将准备相关文件放入kubectl文件夹中

 2、切换到kubectl文件夹内使用docker build 构建镜像

docker build --tag=kubectl:v1.19.7 .

3、测试镜像

// 创建测试容器并将kubeconfig挂载到容器中
docker run --name kubectl -d -v /root/.kube:/root/.kube kubectl:v1.19.7
// 进入容器使用kubectl命令
docker exec -it kubectl bash
kubectl get node

测试结果

 

<think>嗯,用户明确要求了解在Ubuntu系统上制作Java镜像并发布到Kubernetes的完整流程。从提供的引用材料看,用户其实已经掌握了一些零散知识:引用[1]提到容器化H2数据库,引用[2]展示JDK11镜像Dockerfile,引用[3]涉及私有镜像仓库的使用。这说明用户需要的是系统化的整合指导。 用户可能是个刚接触k8s的Java开发者,正在搭建微服务部署流水线。ta特意强调"详细步骤",说明需要可落地的操作指南而非理论概念。值得注意的是,用户提供的Dockerfile示例里存在安全隐患(root用户操作)和优化空间(缺少多阶段构建),这需要在正式回复时修正。 技术要点要覆盖全链路:从基础镜像选择开始,必须解释为什么推荐使用eclipse-temurin官方镜像而非centos+手动安装JDK;镜像推送环节要补充docker login的凭证安全存储方案;k8s部署部分需强调资源配置文件的参数化设计。尤其要提醒用户避免常见坑点,比如ENTRYPOINT尾部多余的&amp符号会引发PID1问题。 考虑到用户环境是Ubuntu+k8s 1.22,需要特别标注apiVersion兼容性(apps/v1在1.22仍可用)。JFrog仓库的配置示例很实用,但得补充说明ingress或service暴露的差异。最后的安全建议模块不可或缺,毕竟用户引用的Dockerfile里用root跑了应用。 </think>以下是基于Ubuntu系统制作Java应用镜像并发布到Kubernetes的详细步骤,整合最佳实践和安全性优化: --- ### **1. 环境准备** ```bash # 安装必备工具 sudo apt update && sudo apt install -y docker.io openjdk-11-jdk maven git ``` --- ### **2. 编写Spring Boot应用** - 创建简单REST接口(`src/main/java/com/example/DemoApplication.java`): ```java @RestController @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @GetMapping("/") public String hello() { return "Hello from K8s!"; } } ``` --- ### **3. 构建应用JAR包** ```bash mvn clean package -DskipTests # 生成target/demo-0.0.1.jar ``` --- ### **4. 优化Docker镜像制作** **Dockerfile (安全增强版)**: ```dockerfile # 阶段1:构建环境 FROM eclipse-temurin:11-jdk-focal AS builder WORKDIR /app COPY . . RUN ./mvnw package -DskipTests # 阶段2:生产镜像(轻量级) FROM eclipse-temurin:11-jre-focal WORKDIR /app # 创建非root用户增强安全 RUN useradd -m appuser && chown -R appuser:appuser /app USER appuser # 复制构建产物 COPY --from=builder --chown=appuser:appuser /app/target/*.jar app.jar # 优化JVM内存配置 ENV JAVA_OPTS="-XX:+UseContainerSupport -XX:MaxRAMPercentage=75" EXPOSE 8080 ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar /app/app.jar"] ``` > 📌 关键改进:多阶段构建减少镜像体积(~300MB→~150MB),非root用户运行提升安全性[^1]。 --- ### **5. 构建并推送镜像到私有仓库** ```bash # 构建镜像(替换your-registry.example.com) docker build -t your-registry.example.com/java-demo:v1 . # 登录私有仓库(参考引用[3]) docker login your-registry.example.com -u admin -p $REGISTRY_PASS # 推送镜像 docker push your-registry.example.com/java-demo:v1 ``` --- ### **6. 配置Kubernetes部署** **deployment.yaml**: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: java-demo spec: replicas: 2 selector: matchLabels: app: java-demo template: metadata: labels: app: java-demo spec: containers: - name: app image: your-registry.example.com/java-demo:v1 # 引用私有镜像 ports: - containerPort: 8080 resources: requests: memory: "512Mi" cpu: "0.5" limits: memory: "1024Mi" cpu: "1" securityContext: runAsUser: 1000 # 匹配Dockerfile的非root用户UID --- # 服务暴露(NodePort示例) apiVersion: v1 kind: Service metadata: name: java-demo-svc spec: selector: app: java-demo type: NodePort ports: - protocol: TCP port: 80 targetPort: 8080 ``` --- ### **7. 部署到Kubernetes集群** ```bash kubectl apply -f deployment.yaml # 验证部署状态 kubectl get pods -l app=java-demo kubectl get svc java-demo-svc ``` --- ### **8. 访问验证** ```bash # 获取服务访问端口(例:NodePort 32015) curl http://<节点IP>:<NodePort>/ # 预期输出:Hello from K8s! ``` --- ### **安全增强建议** 1. **私钥管理**:使用K8s Secret存储仓库凭证 ```bash kubectl create secret docker-registry reg-cred \ --docker-server=your-registry.example.com \ --docker-username=admin \ --docker-password=$REGISTRY_PASS ``` 在deployment.yaml中添加: ```yaml spec: imagePullSecrets: - name: reg-cred ``` 2. **镜像漏洞扫描**:集成Trivy或Clair扫描镜像 3. **网络策略**:限制Pod网络访问权限 > 注:生产环境建议使用Ingress替代NodePort,并配置HTTPS证书[^2][^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值