DevOps搭建(十五)-kubernetes部署项目详细步骤

1、k8s简介

k8s官网地址

https://kubernetes.io/zh-cn/docs/home/

2、安装kuboard

详细步骤可参考官网

https://kuboard.cn/install/install-k8s.html

2.1、环境准备

至少 2 台 2核4G 的服务器。

选择v1.19,因为高版本的已经把docker给舍弃掉了。

https://kuboard.cn/install/history-k8s/install-k8s-1.19.x.html

2.2、修改 hostname

主机执行

# 修改 hostname
hostnamectl set-hostname k8master
# 查看修改结果
hostnamectl status
# 设置 hostname 解析
echo "127.0.0.1   $(hostname)" >> /etc/hosts

从机执行

# 修改 hostname
hostnamectl set-hostname k8sworker
# 查看修改结果
hostnamectl status
# 设置 hostname 解析
echo "127.0.0.1   $(hostname)" >> /etc/hosts

2.3、安装docker及kubelet

主机和从机都要执行

# 在 master 节点和 worker 节点都要执行
# 最后一个参数 1.19.5 用于指定 kubenetes 版本,支持所有 1.19.x 版本的安装
# 腾讯云 docker hub 镜像
# export REGISTRY_MIRROR="https://mirror.ccs.tencentyun.com"
# DaoCloud 镜像
# export REGISTRY_MIRROR="http://f1361db2.m.daocloud.io"
# 华为云镜像
# export REGISTRY_MIRROR="https://05f073ad3c0010ea0f4bc00b7105ec20.mirror.swr.myhuaweicloud.com"
# 阿里云 docker hub 镜像
export REGISTRY_MIRROR=https://registry.cn-hangzhou.aliyuncs.com
curl -sSL https://kuboard.cn/install-script/v1.19.x/install_kubelet.sh | sh -s 1.19.5

2.4、初始化 master 节点

2.4.1、执行初始化脚本

注意只在master节点中执行

# 只在 master 节点执行
# 替换 x.x.x.x 为 master 节点实际 IP(请使用内网 IP)
# export 命令只在当前 shell 会话中有效,开启新的 shell 窗口后,如果要继续安装过程,请重新执行此处的 export 命令
export MASTER_IP=192.168.88.126
# 替换 apiserver.demo 为 您想要的 dnsName
export APISERVER_NAME=apiserver.demo
# Kubernetes 容器组所在的网段,该网段安装完成后,由 kubernetes 创建,事先并不存在于您的物理网络中
export POD_SUBNET=10.100.0.1/16
echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts
curl -sSL https://kuboard.cn/install-script/v1.19.x/init_master.sh | sh -s 1.19.5

2.4.2、检查 master 初始化结果

执行如下命令,等待 3-10 分钟,直到所有的容器组处于 Running 状态

# 只在 master 节点执行

# 执行如下命令,等待 3-10 分钟,直到所有的容器组处于 Running 状态
watch kubectl get pod -n kube-system -o wide

查看 master 节点初始化结果

# 查看 master 节点初始化结果
kubectl get nodes -o wide

2.5、初始化 worker节点

2.5.1、获得 join命令参数

在 master 节点上执行

# 只在 master 节点执行
kubeadm token create --print-join-command

可获取kubeadm join 命令及参数,如下所示

kubeadm join apiserver.demo:6443 --token grrmtv.3dr3rm4vpqr76y9o     --discovery-token-ca-cert-hash sha256:5d9753dfa125ea514cbc66d31151eff395ac4364fd91675ad0460a9d6795f606

2.5.2、初始化worker

针对所有的 worker 节点执行

# 只在 worker 节点执行
# 替换 x.x.x.x 为 master 节点的内网 IP
export MASTER_IP=192.168.88.126
# 替换 apiserver.demo 为初始化 master 节点时所使用的 APISERVER_NAME
export APISERVER_NAME=apiserver.demo
echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts

# 替换为 master 节点上 kubeadm token create 命令的输出
kubeadm join apiserver.demo:6443 --token grrmtv.3dr3rm4vpqr76y9o     --discovery-token-ca-cert-hash sha256:5d9753dfa125ea514cbc66d31151eff395ac4364fd91675ad0460a9d6795f606

2.5.3、检查初始化结果

只在 master 节点执行

# 只在 master 节点执行
kubectl get nodes -o wide

输出结果如下所示:

3、安装kuboard图形化管理工具

官方详细步骤地址:

https://kuboard.cn/install/v3/install-in-k8s.html#安装

3.1、执行 Kuboard v3 在 K8S 中的安装

kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3.yaml
# 您也可以使用下面的指令,唯一的区别是,该指令使用华为云的镜像仓库替代 docker hub 分发 Kuboard 所需要的镜像
# kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3-swr.yaml

3.2、等待 Kuboard v3 就绪

在master节点上执行以下指令,等待 kuboard 名称空间中所有的 Pod 就绪,如下所示

watch kubectl get pods -n kuboard

3.3、访问 Kuboard

http://192.168.88.126:30080/

输入初始用户名和密码,并登录

用户名: admin

密码: Kuboard123

4、基本操作

4.1、Namespace操作

命名空间是为了隔离各个环境的,比如开发环境叫dev,测试环境叫test等,执行以下语句就能创建一个命名空间

4.1.1、创建命名空间

方式一
kubectl create ns test
方式二

此外还可以通过yml的方式创建,如先创建一个namespace-test.yml,内容如下:

apiVersion: v1
kind: Namespace
metadata:
  name: test

kubectl apply -f namespace-test.yml

4.1.2、删除命名空间

kubectl delete ns test

4.1.3、查看所有命名空间

kubectl get ns

4.2、Pod操作

4.2.1、查看pod

查看所有的pod

注意:最后要加上 -A,如果不加,默认查询default命名空间下的pod

kubectl get pods -A

查看指定命名空间的pod

kubectl get pods -n test

4.2.2、运行一个pod

方式一
kubectl run nginx --image=nginx:latest

也可以指定具体的镜像名和命名空间,

例如我们可以到一个国内的镜像站:https://hub.daocloud.io/

下找到nginx对应具体镜像daocloud.io/library/nginx:1.9.1版本进行安装,并指定安装到test命名空间下。

kubectl run nginx --image=daocloud.io/library/nginx:1.9.1 -n test
方式二

此外还可以通过yml的方式创建,如先创建一个pod-test.yml,内容如下,其中containers下可以有多个镜像信息,也就是说一个pod里可以部署多个docker容器:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-yml
  namespace: test
spec:
  containers:
  - image: daocloud.io/library/nginx:1.9.1
    name: nginx-yml

kubectl apply -f pod-test.yml

查看pod详情可以知道pod内部的ip

kubectl describe pod nginx -n test

得到ip,发现这个ip其实是在步骤2.4.1中POD_SUBNET设定的ip范围。

接着我们可以直接curl 10.100.162.196可看到nginx响应相关信息,但是现在还无法通过外部访问。

4.2.3、查看pod的详细信息

以下命令是查看test命名空间下的nginx的pod信息。

kubectl describe pod nginx -n test

4.2.4、进入pod的容器中查看日志

pod里运行的其实是docker容器,通过以下命令查看容器日志:

kubectl logs -f nginx -n test

4.2.5、进入pod中的容器中

kubectl exec -it nginx -n test -- bash

4.2.4、删除pod

以下命令就是把default命名空间下的nginx这个pod删除掉

kubectl delete pod nginx -n default

4.3、图形化界面操作Pod

点击默认集群

如下图,找到对应的命名空间:

在进入容器组中,能看到容器的信息:

4.4、Deployment操作

4.4.1、创建一个deployment

方式一
kubectl create deployment deploy-nginx -n test --image=daocloud.io/library/nginx:1.9.1
方式二

通过yml的方式创建管理,更推荐使用这种方式,更方便管理运行。

我们可以到官网摘抄下:

https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/

首先创建一个deployment-nginx.yml文件

vi deployment-nginx.yml

内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: test
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: daocloud.io/library/nginx:1.9.1
        ports:
        - containerPort: 80

最后运行以下脚本

kubectl apply -f deployment-nginx.yml

4.4.2、查看deployment

kubectl get deploy -n test

4.4.2、删除deployment

kubectl delete deployment deploy-nginx

4.5、图形化界面操作Deployment

4.5.1、查看容器组

在新增一个deployment后,会默认创建一个pod,我们可以到图形化界面看到

到工作负载里能看到deployment:

4.5.2、查看工作负载

进到详情里能看到各种操作按钮

4.5.3、自动伸缩pod

如下操作,可快速的伸缩指定deployment下的pod数量:

再到容器组里看到多了一个pod

4.6、Service操作

4.6.1、创建Service

4.6.1.1、暴露Deployment生成

要想访问deployment,首先我们需要暴露个端口

kubectl expose deployment nginx-deployment --port=8888 --target-port=80 -n test

上面脚本的意思是:将命名空间test里deployment为nginx-deployment对外暴露端口,端口为888,映射到pod容器里的nginx端口80。

上面方式只能在服务器内部访问,在浏览器是无法访问的,如果想外部也能访问,需要加type=NodePort参数:

kubectl expose deployment nginx-deployment --port=8888 --target-port=80 -n test --type=NodePort

暴露了之后,生成对应的service

kubectl get service -n test

图形化界面也能看到

4.6.1.2、通过yml文件创建

创建一个yml文件

vi deployment-service.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: test
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: daocloud.io/library/nginx:1.9.1
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  namespace: test
  #注意:这里要和Deployment的名称一致
  name: nginx-deployment
  labels:
    app: nginx-deployment
spec:
  selector:
    #注意:这里要和Deployment的app名称一致
    app: nginx
  ports:
  #Service的端口
  - port: 8888
    #容器内的端口
    targetPort: 80
  type: NodePort

执行yml文件

kubectl apply -f deployment-service.yml

执行后可以在图形化界面看到服务了

4.6.2、查看Service

kubectl get service -n test

可以看到Service的ip和端口,请求ip:port,返回nginx信息

curl http://10.96.68.96:8888/

浏览器通过主机ip+外部端口访问:

http://192.168.88.126:30833/

4.7、Ingress操作

4.7.1、安装Ingress

如下图,在集群管理->IngressClass菜单进入安装页面

点击安装弹出如下界面,选择使用私有镜像仓库,点击确定按钮

安装完之后,容器组进入 Succeeded 或 Running 状态之后,IngressNginxController 就可以正常工作。

4.7.2、通过yml创建Ingress

在4.6.1.2步骤中的yml文件追加ingress脚本

vi deployment-nginx.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: test
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: daocloud.io/library/nginx:1.9.1
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  namespace: test
  #注意:这里要和Deployment的名称一致
  name: nginx-deployment
  labels:
    app: nginx-deployment
spec:
  selector:
    #注意:这里要和Deployment的app名称一致
    app: nginx
  ports:
  #Service的端口
  - port: 8888
    #容器内的端口
    targetPort: 80
  type: NodePort
---
#apiVersion值必须写成networking.k8s.io/v1
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: test
  name: nginx-ingress
spec:
  ingressClassName: ingress
  rules:
  #映射的域名
  - host: abc.def.com
    http:
      paths:
      #访问什么样的路径
      - path: /
        #匹配方式,前缀匹配,即匹配上path配置的斜杠就可以
        pathType: Prefix
        backend:
        #自定用哪个service
          service:
            name: nginx-deployment
            port:
              #映射的端口
              number: 8888

执行脚本

kubectl apply -f deployment-nginx.yml

4.7.3、配置域名访问

C:\Windows\System32\drivers\etc

192.168.88.126 abc.def.com
相关推荐
_.Switch1 小时前
高级Python自动化运维:容器安全与网络策略的深度解析
运维·网络·python·安全·自动化·devops
2401_850410831 小时前
文件系统和日志管理
linux·运维·服务器
JokerSZ.1 小时前
【基于LSM的ELF文件安全模块设计】参考
运维·网络·安全
芯盾时代2 小时前
数字身份发展趋势前瞻:身份韧性与安全
运维·安全·网络安全·密码学·信息与通信
心灵彼岸-诗和远方3 小时前
DevOps业务价值流:架构设计最佳实践
运维·产品经理·devops
一只哒布刘3 小时前
NFS服务器
运维·服务器
苹果醋34 小时前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx
二十雨辰4 小时前
[linux]docker基础
linux·运维·docker
Jason-河山5 小时前
【自动化更新,让商品信息跳舞】——利用API返回值的幽默编程之旅
运维·自动化
lihuhelihu5 小时前
第3章 CentOS系统管理
linux·运维·服务器·计算机网络·ubuntu·centos·云计算