K8S 应用部署

简介

在上篇文章中,我们安装了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 registry
cd 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 ps
CONTAINER ID   IMAGE             COMMAND                  CREATED        STATUS        PORTS                                               NAMES
4322bed9e795   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.plus
Authenticating with existing credentials...
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://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 --decode
kubectl 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 ps
CONTAINER           IMAGE               CREATED             STATE               NAME                        ATTEMPT             POD ID
65f738a94ab43       7548f6570748a       6 hours ago         Running             auth-java                   0                   78d02b56fcfa6
93c138b35118e       7801cfc6d5c07       3 days ago          Running             dashboard-metrics-scraper   0                   87f8f420a8614
c1e3fc2d6c6d9       57446aa2002e1       3 days ago          Running             kubernetes-dashboard        0                   68897036dab5f
db3684cf5e6a2       a3447b26d32c7       5 days ago          Running             calico-node                 0                   cb13bab18abe7
5811551b53ad0       db4da8720bcb9       5 days ago          Running             kube-proxy                  1                   2960526e1e594

# 设置监听8080端口好像无效,查看下应用监听在那个端口,可以看大监听在9000端口
➜  ~ crictl exec 65f738a94ab43 netstat -apn
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 :::9000                 :::*                    LISTEN      1/java
tcp        0      0 ::ffff:192.168.3.206:38186 ::ffff:139.9.159.127:3306 ESTABLISHED 1/java
tcp        0      0 ::ffff:192.168.3.206:37896 ::ffff:139.9.159.127:3306 ESTABLISHED 1/java
tcp        0      0 ::ffff:192.168.3.206:38038 ::ffff:139.9.159.127:3306 ESTABLISHED 1/java
tcp        0      0 ::ffff:192.168.3.206:38090 ::ffff:139.9.159.127:3306 ESTABLISHED 1/java
tcp        0      0 ::ffff:192.168.3.206:38124 ::ffff:139.9.159.127:3306 ESTABLISHED 1/java
tcp        0      0 ::ffff:192.168.3.206:38218 ::ffff:139.9.159.127:3306 ESTABLISHED 1/java
tcp        0      0 ::ffff:192.168.3.206:37954 ::ffff:139.9.159.127:3306 ESTABLISHED 1/java
tcp        0      0 ::ffff:192.168.3.206:38076 ::ffff:139.9.159.127:3306 ESTABLISHED 1/java
tcp        0      0 ::ffff:192.168.3.206:38138 ::ffff:139.9.159.127:3306 ESTABLISHED 1/java
tcp        0      0 ::ffff:192.168.3.206:38198 ::ffff:139.9.159.127:3306 ESTABLISHED 1/java
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node PID/Program name    Path
unix  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会在重启后变化,需要一些更好的访问方式,这部分等博主后序尝试了

参考链接


版权声明:本文为github_35735591原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。