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
相关推荐
2301_780943841 分钟前
linux 对文件打补丁(Patch)
linux·运维·服务器
ICT董老师7 分钟前
通过kubernetes部署nginx + php网站环境
运维·nginx·云原生·容器·kubernetes·php
原神启动17 分钟前
K8S(八)—— Kubernetes Pod 资源限制 + 探针(Probe)解析
云原生·容器·kubernetes
敬往事一杯酒哈12 分钟前
Ubuntu 20.04 安装Anacada
linux·运维·ubuntu
还在忙碌的吴小二13 分钟前
Jenkins CLI (jcli) 使用手册
运维·jenkins
zxnbmk15 分钟前
【7】Kubernetes存储(本章知识密度较高,仅浅浅了解后续详解)
linux·云原生·容器·kubernetes
ChangYan.15 分钟前
Windows命令行(cmd)下快速查找文件路径(类似Linux下find命令)
linux·运维·服务器
叫致寒吧16 分钟前
pod详解
云原生·kubernetes
陈让然32 分钟前
VS Code新版本无法连接WSL ubuntu18.04
linux·运维·ubuntu