写点什么

K8S 应用部署

作者:
  • 2022 年 7 月 01 日
  • 本文字数:4446 字

    阅读完需:约 15 分钟

简介

在上篇文章中,我们安装了 K8S 的基础组件,并按照网页的 Dashboard 控制台,接下来我们尝试使用 K8S 来部署我们自己的应用

历史文章回顾

总体概览

在上篇中我们安装好了 K8S,并进行了访问,基于之前的基础,我们开始部署我们自己的应用


文章大致的主要内容如下:


  • 1.搭建自己私有化的镜像仓库:使用公共的 docker 镜像也可以,博主想体验下私有仓库,用于 K8S 拉取镜像

  • 2.使用 Dashboard 部署应用,并访问

私有镜像仓库搭建

注:这个搭建还是比较麻烦的,使用 dockerhub 的公共仓库也是没有问题,使用 dockerhub 的 key 跳过这部分


首先找台服务器,安装 docker,安装这里就不说了,官方的教程很全面



并且按照 docker compose,运行下面的命令


yum install -y docker-compose-plugin
复制代码


需要用到域名证书,这个和上篇一样:


生成 HTTP 认证文件

运行下面的命令,生成认证文件,username 和 password 换成你自己的用户和密码


mkdir /home/docker/auth
docker run --rm \ --entrypoint htpasswd \ httpd:alpine \ -Bbn username password > /home/docker/auth/nginx.htpasswd
复制代码

Registry 运行

编写 docker-compose.yaml 文件,使用文件配置部署比较好,直接用 docker 命令后序不好查看


# 先将文件夹用于存放docker register容器部署文件mkdir registrycd registry# 编辑文件vim docker-compose.yml
# 填入下面的内容version: '3'
services: registry: image: registry ports: - "1443:443" environment: - REGISTRY_AUTH=htpasswd - REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm - REGISTRY_AUTH_HTPASSWD_PATH=/auth/nginx.htpasswd - REGISTRY_HTTP_ADDR=0.0.0.0:443 - REGISTRY_HTTP_TLS_CERTIFICATE=/certs/xiuxian.plus_bundle.crt - REGISTRY_HTTP_TLS_KEY=/certs/xiuxian.plus.key volumes: - /var/lib/registry:/var/lib/registry - /home/docker/auth:/auth - /etc/nginx/cert:/certs
复制代码


如上面的配置文件


我们先将相关的目录挂载下:


  • /var/lib/registry:/var/lib/registry 挂载主机目录,存储下相关的镜像,避免重启后镜像丢失

  • /home/docker/auth:/auth 将 HTTP 认证文件所在的目录挂载进去

  • /etc/nginx/cert:/certs 将域名证书目录挂载进去


registry 设置监听在 443 端口,并且将其映射到宿主机的 1443 端口


剩下的都是相关的配置,认证方式,所用的认证文件,相关的 ssl 文件等等


编写完成后,我们在 docker-compose.yaml 坐在的目录下运行下面的命令:


# 启动docker compose up -d
# 看下运行状态➜ auth docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES4322bed9e795 registry "/entrypoint.sh /etc…" 23 hours ago Up 22 hours 5000/tcp, 0.0.0.0:1443->443/tcp, :::1443->443/tcp registry-registry-1
复制代码


映射到 1443 端口是因为 443 端口被 nginx 占用了


如果你们的没有被占用,直接设置映射到 443 端口即可


博主的 nginx 相关配置如下:


server {    listen       443 ssl http2;    listen       [::]:443 ssl http2;    server_name  www.xiuxian.plus xiuxian.plus;    root         /usr/share/nginx/html;
ssl_certificate "/etc/nginx/cert/xiuxian.plus_bundle.crt"; ssl_certificate_key "/etc/nginx/cert/xiuxian.plus.key"; ssl_session_cache shared:SSL:1m; ssl_session_timeout 10m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on;
# Load configuration files for the default server block. include /etc/nginx/default.d/*.conf;
# docker registry的访问都是v2开头的,我们设置v2的前缀都转到registry即可 location /v2 { proxy_pass https://xiuxian.plus:1443/v2; client_max_body_size 500m; }
error_page 404 /404.html; location = /40x.html { }
error_page 500 502 503 504 /50x.html; location = /50x.html { }}
复制代码

docker 上传镜像

搭建完成后,我们可以直接使用 docker 登录到镜像仓库,如何上传镜像


# 登录➜ docker login xiuxian.plusAuthenticating with existing credentials...WARNING! Your password will be stored unencrypted in /root/.docker/config.json.Configure a credential helper to remove this warning. Seehttps://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
# 上传镜像docker push xiuxian.plus/auth-java:v2.0
复制代码


这样基本上我们的私有镜像仓库已经可以了

使用 Dashboard 部署应用,并访问

私有仓库访问秘钥生成

首先我们在 k8s 的主节点上创建用来访问我们私有仓库的秘钥:


运行下面的命令:


kubectl create secret docker-registry --namespace=xiuxian xiuxian.docker.register --docker-server=xiuxian.plus --docker-username=username --docker-password=password --docker-email=1243925457@qq.com
复制代码


需要变化的配置如下:


  • --namespace=xiuxian :指定命名空间

  • xiuxian.docker.register :秘钥名称

  • -docker-server=xiuxian.plus :镜像仓库地址

  • --docker-username=username --docker-password=password --docker-email=1243925457@qq.com :用户名、密码和邮箱


创建好后备用,可以用下面的命令进行查看相关信息:


kubectl get secret --namespace=xiuxian xiuxian.docker.register --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decodekubectl get secret --namespace=xiuxian xiuxian.docker.register -o yaml
复制代码

应用部署

在上篇中,我们已经搭建好了 K8S 的 Dashboard,我们便可以使用它来部署我们的应用


使用 token 登录 Dashboard,如下:



token 的获取,如果忘记了,可以在 k8s 的主节点上运行下面的命令进行获取


kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
复制代码


点击下面图中的,右上角的+号,我们新建一个 deployment,选择表单创建,然后输入的内容大致如下:



命名空间和我们上面的对应上,如果有环境变量的话,可以在页面最后面填上,或者部署后进行修改也行


点击确定后,我们在左侧的 deployment 可以看到我们的应用:



pods 页面中可以看到具体的,显示部署在了那个节点:



点击进去,可以看到更详细的,我们可以看到其分配到 ip



目前还不太熟悉 k8s 的访问方式(其实是博主 service 和其他方式没用尝试成功......),所以我们继续采用原始的访问方式去访问应用

应用访问

我们登录应用部署的节点,查看下容器情况


# 查看当前运行的容器,可以看到我们的auth-java应用➜  ~ crictl psCONTAINER           IMAGE               CREATED             STATE               NAME                        ATTEMPT             POD ID65f738a94ab43       7548f6570748a       6 hours ago         Running             auth-java                   0                   78d02b56fcfa693c138b35118e       7801cfc6d5c07       3 days ago          Running             dashboard-metrics-scraper   0                   87f8f420a8614c1e3fc2d6c6d9       57446aa2002e1       3 days ago          Running             kubernetes-dashboard        0                   68897036dab5fdb3684cf5e6a2       a3447b26d32c7       5 days ago          Running             calico-node                 0                   cb13bab18abe75811551b53ad0       db4da8720bcb9       5 days ago          Running             kube-proxy                  1                   2960526e1e594
# 设置监听8080端口好像无效,查看下应用监听在那个端口,可以看大监听在9000端口➜ ~ crictl exec 65f738a94ab43 netstat -apnActive Internet connections (servers and established)Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program nametcp 0 0 :::9000 :::* LISTEN 1/javatcp 0 0 ::ffff:192.168.3.206:38186 ::ffff:139.9.159.127:3306 ESTABLISHED 1/javatcp 0 0 ::ffff:192.168.3.206:37896 ::ffff:139.9.159.127:3306 ESTABLISHED 1/javatcp 0 0 ::ffff:192.168.3.206:38038 ::ffff:139.9.159.127:3306 ESTABLISHED 1/javatcp 0 0 ::ffff:192.168.3.206:38090 ::ffff:139.9.159.127:3306 ESTABLISHED 1/javatcp 0 0 ::ffff:192.168.3.206:38124 ::ffff:139.9.159.127:3306 ESTABLISHED 1/javatcp 0 0 ::ffff:192.168.3.206:38218 ::ffff:139.9.159.127:3306 ESTABLISHED 1/javatcp 0 0 ::ffff:192.168.3.206:37954 ::ffff:139.9.159.127:3306 ESTABLISHED 1/javatcp 0 0 ::ffff:192.168.3.206:38076 ::ffff:139.9.159.127:3306 ESTABLISHED 1/javatcp 0 0 ::ffff:192.168.3.206:38138 ::ffff:139.9.159.127:3306 ESTABLISHED 1/javatcp 0 0 ::ffff:192.168.3.206:38198 ::ffff:139.9.159.127:3306 ESTABLISHED 1/javaActive UNIX domain sockets (servers and established)Proto RefCnt Flags Type State I-Node PID/Program name Pathunix 2 [ ] STREAM CONNECTED 11525779 1/java
复制代码


然后我们访问下:


➜  ~ curl http://192.168.3.206:9000/app/versionCheck\?version\=1{"data":{"downloadUrl":null,"updateMsg":null,"latest":true},"code":200,"msg":null}# 
复制代码


我们直接使用 k8s 分配的 ip+容器应用监听的端口进行访问


如果看到之前博主写的:手动写 docker 系列的网络部分或者熟悉容器网络的,应该对这个比较熟悉


这样,我们基本上上就访问成功,Nice

总结

本篇文章中,我们基于上篇部署的环境,使用 Dashboard 部署了我们的应用,并且成功进行了访问


但方式不是很 K8s,安装官方的说明,pods 的 IP 会在重启后变化,需要一些更好的访问方式,这部分等博主后序尝试了

参考链接

发布于: 刚刚阅读数: 3
用户头像

关注

还未添加个人签名 2018.09.09 加入

代码是门手艺活,也是门艺术活

评论

发布
暂无评论
K8S 应用部署_kubenetes_萧_InfoQ写作社区