Kubernetes的安装和基础操作

Updated on with 0 views and 0 comments

一、简介

K8S简介参考官网即可

Kubernetes 文档 | Kubernetes (p2hp.com)

二、环境搭建

准备两台2核4GB虚拟机

2.1 KuboardSpray

使用Kuboard安装K8S,官方文档见使用 KuboardSpray 安装kubernetes_v1.23.1 | Kuboard

版本说明,选择安装k8s-1.19版本,因为1.20版本弃用了docker

image.png

image.png

2.2 检查环境

2.2.1 检查操作系统版本兼容

image.png

# 在 master 节点和 worker 节点都要执行
cat /etc/redhat-release

2.2.2 检查hostname

# 此处 hostname 的输出将会是该机器在 Kubernetes 集群中的节点名字
# 不能使用 localhost 作为节点的名字
hostname

设置一下两台服务器的hostname

一台设置为slave3 一台设置为slave4

# 分别在两台服务器执行
hostnamectl set-hostname k8sMaster
echo "127.0.0.1   $(hostname)" >> /etc/hosts

hostnamectl set-hostname k8sWorker
echo "127.0.0.1   $(hostname)" >> /etc/hosts

2.2.3 检查CPU


# 请使用 lscpu 命令,核对 CPU 信息
# Architecture: x86_64    本安装文档不支持 arm 架构
# CPU(s):       2         CPU 内核数量不能低于 2
lscpu

image.png

2.2.4 网络检查

两台服务器分别执行下述命令,并验证网络是否联通ip route show

# 查看默认网关路由
[root@localhost ~]# ip route show
default via 192.168.126.2 dev ens33 proto static metric 100 
192.168.126.0/24 dev ens33 proto kernel scope link src 192.168.126.4 metric 100 
# 查看网关对应的IP
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:96:3a:61 brd ff:ff:ff:ff:ff:ff
    inet 192.168.126.4/24 brd 192.168.126.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::99d4:7c88:8e5d:6da5/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

kubelet使用的IP地址

  • ip route show 命令中,可以知道机器的默认网卡,通常是 ens33,不同如 default via 192.168.126.2 dev ens33,不同版本的centos可能会有所区别
  • ip address 命令中,可显示默认网卡的 IP 地址,Kubernetes 将使用此 IP 地址与集群内的其他节点通信,如 192.168.126.4
  • 所有节点上 Kubernetes 所使用的 IP 地址必须可以互通(无需 NAT 映射、无安全组或防火墙隔离)

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

image.png

2.4 初始化master节点

关于初始化时用到的环境变量

  • APISERVER_NAME 不能是 master 的 hostname
  • APISERVER_NAME 必须全为小写字母、数字、小数点,不能包含减号
  • POD_SUBNET 所使用的网段不能与 master节点/worker节点 所在的网段重叠。该字段的取值为一个 CIDR 值,如果您对 CIDR 这个概念还不熟悉,请仍然执行 export POD_SUBNET=10.100.0.1/16 命令,不做修改
# 只在 master 节点执行
# 替换 x.x.x.x 为 master 节点实际 IP(请使用内网 IP)
# export 命令只在当前 shell 会话中有效,开启新的 shell 窗口后,如果要继续安装过程,请重新执行此处的 export 命令
export MASTER_IP=192.168.126.4
# 替换 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

检查 master 初始化结果

# 只在 master 节点执行

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

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

2.5 初始化worker

2.5.1 获得join参数

在master执行

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

[root@localhost ~]# kubeadm token create --print-join-command
W0628 11:32:29.038345  113559 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
kubeadm join apiserver.demo:6443 --token a8s70o.vezwmu1qnvehc083     --discovery-token-ca-cert-hash sha256:2c52bb56b13ca7761e2ef735901cd7a9c266941698e6b55c3d8d6743daa5a0d1

2.5.2 初始化worker

# 只在 worker 节点执行
# 替换 x.x.x.x 为 master 节点的内网 IP
export MASTER_IP=x.x.x.x
# 替换 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 a8s70o.vezwmu1qnvehc083     --discovery-token-ca-cert-hash sha256:2c52bb56b13ca7761e2ef735901cd7a9c266941698e6b55c3d8d6743daa5a0d1

回到master节点执行下述命令可以看到worker已经就为

kubectl get nodes -o wide

image.png

2.6 K8S中安装Kuboard

master节点上执行

kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3-swr.yaml

执行指令 watch kubectl get pods -n kuboard,等待 kuboard 名称空间中所有的 Pod 就绪,如下所示

  • 在浏览器中打开链接 http://your-node-ip-address:30080
  • 输入初始用户名和密码,并登录
    • 用户名: admin
    • 密码: Kuboard123

三、基础操作

3.1 命名空间

3.1.1 查询namespace

kubectl get namespace

image.png

3.1.2 创建命名空间

创建命名空间,名称为test

kubectl create ns test

image.png

3.1.3 删除命名空间

删除名为test的命名空间

kubectl delete ns test

image.png

3.1.4 yml创建命名空间

vi namespace-test.yml

内容为

apiVersion: v1
kind: Namespace
metadata:
  name: test

执行

kubectl apply -f namespace-test.yml

image.png

3.2 pod操作

3.2.1 查询pod

3.2.1.1 查询默认空间下pod
kubectl get pods
[root@localhost opt]# kubectl get pods
No resources found in default namespace.
3.2.1.2 查询所有命名空间下pod
kubectl get pods -A

image.png

3.2.1.3 查询指定命名空间下pod
kubectl get pods -n 命名空间名称

image.png

3.2.2 运行一个pod

kubectl run nginx --image=nginx:latest

image.png

# 在指定命名空间下创建pod
kubectl run nginx --image=nginx:latest -n 命名空间名称

查看这个容器

kubectl get pod -n default

image.png

查看信息

kubectl describe pod nginx

image.png

3.2.3 删除一个pod

# 删除指定命名空间下的pod
kubectl delete pod nginx -n default

image.png

3.2.3 查看pod日志

# kubectl logs -f pod名 -n 命名空间名称
kubectl logs -f nginx -n test

3.2.4 进入pod内部

kubectl exec -it pod名 -n 命名空间名称 -- bash
kubectl exec -it nginx -n test -- bash

3.2.5 通过yml运行pod

创建一个yml

vi nginx.yml

内容为

apiVersion: v1
kind: Pod
metadata:
  name: nginx-yml
  namespace: test
spec:
  containers:
  - image: nginx:latest
    name: nginx-yml
kubectl apply -f nginx.yml

查看pod信息

kubectl describe pod nginx-yml -n test

此时如果要删除这个pod除了运行

kubectl delete pod nginx-yml -n test

还可以运行

kubectl delete -f nginx.yml

3.2.6 pod多容器运行与图形化查看

vi nginx-tomcat.yml

内容如下

apiVersion: v1
kind: Pod
metadata:
  name: nginx-tomcat
  namespace: test
spec:
  containers:
  - image: nginx:latest
    name: nginx
  - image: tomcat:latest
    name: tomcat

执行

kubectl apply -f nginx-tomcat.yml

访问kuboard界面就可以看到这个pod

image.png

在界面上也可以进行各项操作

3.3 Deployment操作

3.3.1 创建

# kubectl create deployment 名称 -n 命名空间 --image=镜像
kubectl create deployment deploy-nginx -n test --image=nginx:latest

image.png

3.3.2 查询

# kubectl get deploy -n 命名空间
kubectl get deploy -n test

image.png

界面上也显示了这个deploy

image.png

同时还创建了这个deploy指定的镜像

image.png

此时在服务器执行,看到这个pod正在运行

kubectl get pod -n test

把这个pod删除

kubectl delete pod deploy-nginx-586c668f57-xf64r -n test

image.png

再回到界面上,发现他又自动运行了一个pod

image.png

这里点伸缩,会帮我们部署多个pod出来

image.png

image.png

再看容器组已经运行了两个pod

image.png

3.3.3 删除

# kubectl delete deploy deploy名称 -n 命名空间
kubectl delete deploy deploy-nginx -n test

界面上对应的pod和deploy都没了

image.png

3.3.3.4 yml操作

在官网找一个示例Deployments | Kubernetes

vi deploy-nginx.yml

内容为

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

执行

kubectl apply -f deploy-nginx.yml -n test

图形化界面上就看到了这个deploy和pod

image.png

image.png

3.4 Service操作

3.4.1 创建

下面这种创建方式只能在服务器内部访问

kubectl expose deploy deploy名称 --port=对外端口 --target-port=映射的deploy端口 -n 命名空间
kubectl expose deploy nginx-deployment --port=8888 --target-port=80 -n test

image.png

3.4.2 查询

kubectl get service -n 命名空间
kubectl get service -n test

image.png

此时我们去修改nginx的index.html文件内容

image.png

这里有三个pod以第一个为例,进入他的bash,执行下述操作

cd /usr/share/nginx/html/
echo 111 > index.html

依次修改另外两个容器html内容为222和333

访问我们创建的service的ip和端口

image.png

image.png

3.4.3 删除

kubectl delete service service名称 -n 命名空间
kubectl delete service nginx-deployment -n test

image.png

3.4.4 服务器外部访问

加上--type=NodePort

kubectl expose deploy deploy名称 --port=对外端口 --target-port=映射的deploy端口 -n 命名空间 --type=NodePort
kubectl expose deploy nginx-deployment --port=8888 --target-port=80 -n test --type=NodePort

此时查看信息

kubectl get service -n test

image.png

用node的IP加30078端口就可以访问了

image.png

3.4.5 yml操作

删除之前建立的service和deploy后执行下述操作

vi service-deploy-nginx.yml

内容为

apiVersion: apps/v1
kind: Deployment
metadata:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  selector: 
    app: nginx
  ports:
  - port: 8888
    targetPort: 80
  type: NodePort

注意名称有对应关系

image.png

kubectl apply -f service-deploy-nginx.yml -n test

在界面中也能看到对用的负载、容器和服务

image.png

image.png

image.png

也能正常访问nginx

image.png

3.5 Ingress操作

3.5.1 安装ingress

image.png

直接下载安装,完成后界面上显示

image.png

删除之前的操作

kubectl delete -f service-deploy-nginx.yml -n test

image.png

3.5.3 创建

vi ingress-deploy-nginx.yml

内容为

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  selector:
    app: nginx
  ports:
  - port: 8888
    targetPort: 80
  type: NodePort
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
spec:
  ingressClassName: ingress
  rules:
  - host: long.nginx.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-deployment
            port:
              number: 8888

注意这里的ingressClassName是自己下载ingress时指定的name,backend名称与之前service的name对应然后执行

kubectl apply -f ingress-deploy-nginx.yml -n test

image.png

此时回到界面发现多了一个路由

image.png

此时通过node节点的ip加service可以访问

image.png

在宿主机hosts文件中新增一个域名的映射

宿主机worker节点IP ingress中指定的域名
192.168.126.5 long.nginx.com 

域名访问也正常

image.png

3.5.4 删除

kubectl delete -f ****.yml -n 节点名
kubectl delete -f ingress-deploy-nginx.yml -n test

标题:Kubernetes的安装和基础操作
作者:wenyl
地址:http://www.wenyoulong.com/articles/2024/06/27/1719419347693.html