目录
- 使用k3s快速搭建k8s
- 安装k8s dashboard
- 使用Helm部署K8S资源
- k8s核心命令
- 一切推倒重来
- 资源创建方式
- Namespace
- Pod
- Deployment
- Service
- Ingress
- ConfigMap
- Job
- 数据持久化
- 搭建NFS
- PV和PVC
使用k3s快速搭建k8s
官网地址https://www.rancher.cn/k3s/
k3s是一个轻量级的k8s,拥有k8s的全生命周期,部署快速,两行命令即可搞定,降低k8s繁琐的部署环节,适合进行k8s学习和个人使用。
安装脚本,可以使用如下方法加速安装
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -
如果只想单节点安装,到此步骤就可以完成,看到如下命令说明安装成功
如果想要搭建k8s集群,则在要当master的主机上执行/var/lib/rancher/k3s/server/node-token
获取K3S_TOKEN
然后在work节点上执行curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://myserver:6443 K3S_TOKEN=mynodetoken sh -
其中myserver
为你的master节点的IP地址,K3S_TOKEN
为你的master节点的token
安装k8s dashboard
官网地址https://github.com/kubernetes/dashboard
进行安装
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
设置访问端口
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
将type:ClusterIP
改为type: NodePort
然后查看端口kubectl get svc -A |grep kubernetes-dashboard
创建访问账号
vim dashboard-adminuser.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
获取token进行登录
kubectl -n kubernetes-dashboard create token admin-user
使用Helm部署K8S资源
安装方式
官网地址https://helm.sh/zh/docs/intro/install/
最简单的方式安装curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
,如果发现墙了连不上,那就使用二进制包方式安装
helm上可以配置多个源来从不同的地方下载资源,官网支持的资源都能从这个网站中搜到https://artifacthub.io/
用helm安装资源
具体操作看官网步骤很详细
helm repo add my-repo https://charts.bitnami.com/bitnami
helm install my-release my-repo/nginx
同时也可以使用这个网站,进行快速的资源安装:https://www.kubebiz.com/
k8s核心命令
一切推倒重来
kubectl delete deployment,service,pods --all
资源创建方式
命令行
YAML文件,使用kubectl apply -f xxx.yaml
Namespace
命名空间用来隔离资源
命令行方式
kubectl create ns hello
kubectl delete ns hello
YAML方式
apiVersion: v1
kind: Namespace
metadata:
name: hello
Pod
一句话说明
pod是K8s中创建和管理的、最小的可部署的计算单元
命令行方式
kubectl run mynginx --image=nginx
YAML方式
apiVersion: v1
kind: Pod
metadata:
labels:
run: mynginx
name: mynginx
namespace: default
spec:
containers:
- image: nginx
name: mynginx
kind:要创建的资源类型
metadata.labels:标签信息
metadata.name:要创建的pod名字,这个名字需要是唯一的
spec.containers:要运行的容器的名称和镜像名称。镜像默认来源是DockerHub
常用命令
kubectl get pod
:查看default名称空间的pod
kubectl describe pod名字 pod名字
:查看pod描述
kubectl delete pod pod名字
:删除pod
kubectl logs --follow pod名字
:查看pod的运行日志
kubectl get pod -owide
:查看pod的详细信息如IP和类型
kubectl exec pod名字 命令
:执行命令到pod
kubectl port-forward pod名字名字 外部映射端口:pod内部想要映射端口 --address 0.0.0.0
:外部访问pod内部端口
Deployment
一句话说明
控制Pod,使Pod拥有多副本,自愈,扩缩容等能力
常用命令
kubectl get svc -A
:查看deployment信息
多副本
命令行方式
kubectl create deployment my-dep --image=nginx --replicas=3
YAML方式
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: my-dep
name: my-dep
spec:
replicas: 3
selector:
matchLabels:
app: my-dep
template:
metadata:
labels:
app: my-dep
spec:
containers:
- image: nginx
name: nginx
kind:要创建的资源类型
metadata.labels:标签信息
metadata.name:要创建的Deployment名字,这个名字需要是唯一的
spec.replicas:部署的 pod 副本数量
selector:表示将deployment和pod关联起来的方式
selector.matchLabels:表示deployment会管理所有labels=my-dep的pod
template:相关内容用来定义pod资源相关
template.metadata.labels:来和selector.matchLabels定义的信息关联起来,来表明pod是被deployment管理,这里不需要为pod指定名称,是因为deployment会主动创建pod唯一的名字
扩缩容
命令行方式
kubectl scale --replicas=5 deployment/my-dep
修改YAML方式,修改replicas
kubectl edit deployment my-dep
滚动更新
可以保证在新版本部署pod成功之前,先不删除旧版本的所有pod,pod还是可以提供pod能力。大多数情况下都会采用RollingUpdate方式,滚动更新又可以通过 maxSurge
和 maxUnavailable
字段来控制升级pod的速率
命令行方式
kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record
kubectl rollout status deployment/my-dep
YAML方式
修改 kubectl edit deployment/my-dep
版本回退
# 历史记录
kubectl rollout history deployment/my-dep
# 查看某个历史详情
kubectl rollout history deployment/my-dep --revision=2
# 回滚(回到上次)
kubectl rollout undo deployment/my-dep
# 回滚(回到指定版本)
kubectl rollout undo deployment/my-dep --to-revision=2
存活探针
暂时未使用,待更新
就绪探针
暂时未使用,待更新
Service
一句话说明
将一组pod公开为网络服务的抽象方法,为deployment创建的pod提供稳定的访问地址
命令行方式
#暴露Deploy
kubectl expose deployment my-dep --port=8000 --target-port=80
YAML方式
apiVersion: v1
kind: Service
metadata:
labels:
app: my-dep
name: my-dep
spec:
selector:
app: my-dep
ports:
- port: 8000
protocol: TCP
targetPort: 80
ClusterIP
使用k8s集群的内部IP暴露服务,当只需要让集群中运行的其他应用程序访问pod时,使用这种类型的Service。
命令行方式,等同于没有–type的
kubectl expose deployment my-dep --port=80 --target-port=80 --type=ClusterIP
YAML方式
apiVersion: v1
kind: Service
metadata:
labels:
app: my-dep
name: my-dep
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 80
selector:
app: my-dep
NodePort
通过每个节点上的 IP 和静态端口(NodePort
)暴露服务,这样就可以在外部访问了,如果想要外部访问使用这种。NodePort范围在 30000-32767 之间
命令行方式
kubectl expose deployment my-dep --port=8000 --target-port=80 --type=NodePort
YAML方式
apiVersion: v1
kind: Service
metadata:
labels:
app: my-dep
name: my-dep
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
selector:
app: my-dep
Ingress
官网地址https://github.com/kubernetes/ingress-nginx
目前遇到pull失败问题,待研究更新
ConfigMap
一句话说明
抽取应用配置,并且可以自动更新
命令行方式
# 创建配置,redis保存到k8s的etcd;
kubectl create cm redis-conf --from-file=redis.conf
yaml方式
apiVersion: v1
kind: ConfigMap
metadata:
name: k8s-conf
namespace: default
data:
CM_KEY: "CM_VALUE"
data:data是所有真正的数据,key:默认是文件名 value:配置文件的内容
修改ConfigMap
会自动更新配置
Job
待更新,部署Flink On K8S时更新
数据持久化
搭建NFS
所有节点安装
yum install -y nfs-utils
主节点
#nfs主节点
echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports
mkdir -p /nfs/data
systemctl enable rpcbind --now
systemctl enable nfs-server --now
#配置生效
exportfs -r
从节点
# nfs主节点的IP
showmount -e 192.168.80.100
#执行以下命令挂载 nfs 服务器上的共享目录到本机路径 /root/nfsmount
mkdir -p /nfs/data
mount -t nfs 192.168.80.100:/nfs/data /nfs/data
# 写入一个测试文件
echo "hello nfs server" > /nfs/data/test.txt
测试数据挂载
测试案例:将nginx的pod应用数据持久化保存
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: label-nginx-pv-demo
name: name-nginx-pv-demo
spec:
replicas: 2
selector:
matchLabels:
app: nginx-pv-demo
template:
metadata:
labels:
app: nginx-pv-demo
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html
nfs:
server: 192.168.80.80
path: /nfs/data/nginx-pv
PV和PVC
一句话说明
PV:持久卷(Persistent Volume),将应用需要持久化的数据保存到指定位置
PVC:持久卷申明(Persistent Volume Claim),申明需要使用的持久卷规格
静态供应
#nfs主节点
mkdir -p /nfs/data/01
mkdir -p /nfs/data/02
mkdir -p /nfs/data/03
创建PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv01-10m
spec:
capacity:
storage: 10M
accessModes:
- ReadWriteMany
storageClassName: nfs
nfs:
path: /nfs/data/01
server: 192.168.80.80
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv02-1gi
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
storageClassName: nfs
nfs:
path: /nfs/data/02
server: 192.168.80.80
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv03-3gi
spec:
capacity:
storage: 3Gi
accessModes:
- ReadWriteMany
storageClassName: nfs
nfs:
path: /nfs/data/03
server: 192.168.80.80
PVC创建与绑定
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nginx-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 200Mi
storageClassName: nfs
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: app-nginx-deploy-pvc
name: name-nginx-deploy-pvc
spec:
replicas: 1
selector:
matchLabels:
app: nginx-deploy-pvc
template:
metadata:
labels:
app: nginx-deploy-pvc
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html
persistentVolumeClaim:
claimName: nginx-pvc