K8S简介参考官网即可
Kubernetes 文档 | Kubernetes (p2hp.com)
准备两台2核4GB虚拟机
使用Kuboard安装K8S,官方文档见使用 KuboardSpray 安装kubernetes_v1.23.1 | Kuboard
版本说明,选择安装k8s-1.19版本,因为1.20版本弃用了docker
# 在 master 节点和 worker 节点都要执行
cat /etc/redhat-release
# 此处 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
# 请使用 lscpu 命令,核对 CPU 信息
# Architecture: x86_64 本安装文档不支持 arm 架构
# CPU(s): 2 CPU 内核数量不能低于 2
lscpu
两台服务器分别执行下述命令,并验证网络是否联通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
两台服务器分别执行下述命令
# 在 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
关于初始化时用到的环境变量
# 只在 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
在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
# 只在 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
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
kubectl get namespace
创建命名空间,名称为test
kubectl create ns test
删除名为test的命名空间
kubectl delete ns test
vi namespace-test.yml
内容为
apiVersion: v1
kind: Namespace
metadata:
name: test
执行
kubectl apply -f namespace-test.yml
kubectl get pods
[root@localhost opt]# kubectl get pods
No resources found in default namespace.
kubectl get pods -A
kubectl get pods -n 命名空间名称
kubectl run nginx --image=nginx:latest
# 在指定命名空间下创建pod
kubectl run nginx --image=nginx:latest -n 命名空间名称
查看这个容器
kubectl get pod -n default
查看信息
kubectl describe pod nginx
# 删除指定命名空间下的pod
kubectl delete pod nginx -n default
# kubectl logs -f pod名 -n 命名空间名称
kubectl logs -f nginx -n test
kubectl exec -it pod名 -n 命名空间名称 -- bash
kubectl exec -it nginx -n test -- bash
创建一个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
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
在界面上也可以进行各项操作
# kubectl create deployment 名称 -n 命名空间 --image=镜像
kubectl create deployment deploy-nginx -n test --image=nginx:latest
# kubectl get deploy -n 命名空间
kubectl get deploy -n test
界面上也显示了这个deploy
同时还创建了这个deploy指定的镜像
此时在服务器执行,看到这个pod正在运行
kubectl get pod -n test
把这个pod删除
kubectl delete pod deploy-nginx-586c668f57-xf64r -n test
再回到界面上,发现他又自动运行了一个pod
这里点伸缩,会帮我们部署多个pod出来
再看容器组已经运行了两个pod
# kubectl delete deploy deploy名称 -n 命名空间
kubectl delete deploy deploy-nginx -n test
界面上对应的pod和deploy都没了
在官网找一个示例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
下面这种创建方式只能在服务器内部访问
kubectl expose deploy deploy名称 --port=对外端口 --target-port=映射的deploy端口 -n 命名空间
kubectl expose deploy nginx-deployment --port=8888 --target-port=80 -n test
kubectl get service -n 命名空间
kubectl get service -n test
此时我们去修改nginx的index.html文件内容
这里有三个pod以第一个为例,进入他的bash,执行下述操作
cd /usr/share/nginx/html/
echo 111 > index.html
依次修改另外两个容器html内容为222和333
访问我们创建的service的ip和端口
kubectl delete service service名称 -n 命名空间
kubectl delete service nginx-deployment -n test
加上--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
用node的IP加30078端口就可以访问了
删除之前建立的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
注意名称有对应关系
kubectl apply -f service-deploy-nginx.yml -n test
在界面中也能看到对用的负载、容器和服务
也能正常访问nginx
直接下载安装,完成后界面上显示
删除之前的操作
kubectl delete -f service-deploy-nginx.yml -n test
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
此时回到界面发现多了一个路由
此时通过node节点的ip加service可以访问
在宿主机hosts文件中新增一个域名的映射
宿主机worker节点IP ingress中指定的域名
192.168.126.5 long.nginx.com
域名访问也正常
kubectl delete -f ****.yml -n 节点名
kubectl delete -f ingress-deploy-nginx.yml -n test