kubernetes学习-快速上手速查手册

使用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 -

如果只想单节点安装,到此步骤就可以完成,看到如下命令说明安装成功

image-20230113092022756

如果想要搭建k8s集群,则在要当master的主机上执行/var/lib/rancher/k3s/server/node-token获取K3S_TOKEN

image-20230113093749804

然后在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

如果使用kubectl命令报错,则执行如下命令
在这里插入图片描述

# 查看k3s服务运行情况,如果没运行就将他运行起来
systemctl status k3s

# 将k3s的配置暴露到环境变量
echo "export KUBECONFIG=/etc/rancher/k3s/k3s.yaml" >> /etc/profile

# 使环境变量生效
source /etc/profile

在这里插入图片描述

安装k8s dashboard

官网地址https://github.com/kubernetes/dashboard

进行安装

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

image-20230113094022518

设置访问端口

kubectl edit svc kubernetes-dashboard -n kubernetes-dashboardtype:ClusterIP改为type: NodePort然后查看端口kubectl get svc -A |grep kubernetes-dashboard

image-20230113094206559

创建访问账号

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

image-20230113094334247

使用Helm部署K8S资源

安装方式

官网地址https://helm.sh/zh/docs/intro/install/

最简单的方式安装curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash,如果发现墙了连不上,那就使用二进制包方式安装,或者直接访问这个地址下载https://get.helm.sh/helm-v3.10.3-linux-amd64.tar.gz

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方式,滚动更新又可以通过 maxSurgemaxUnavailable 字段来控制升级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

解决官网Ingress安装不了问题

官网地址https://github.com/kubernetes/ingress-nginx

公司里的大牛组长教了一手:其实当包拉不下来的时候,一般可以配个代理,以clash for window为例,先记住这两个ip和端口
在这里插入图片描述
然后配置代理,可以先export试试看,如果不行再走下面方法

export http_proxy=http://192.168.80.1:7890
export https_proxy=http://192.168.80.1:7890
export no_proxy=localhost,127.0.0.1,docker-registry.example.com,.corp,

当export完之后,会发现curl、docker、kubectl等以前拉不动的包现在可以拉取了。上面配置的就是代理的IP和端口
如果这种方式无效,还可以通过如下方式

# 创建配置文件
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf

# 添加配置
[Service]
Environment="HTTP_PROXY=http://192.168.80.1:7890"
Environment="HTTPS_PROXY=http://192.168.80.1:7890"
Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp,"

# 重启容器
sudo systemctl daemon-reload
sudo systemctl restart docker

然后发现以前下不来的镜像等,现在可以下载了,这个时候如果使用kubectl还是没办法访问拉去的话,还可以整个活,那就是先用docker pull到本地,然后本地打tag,最后推送到自己的阿里云镜像服务上做个跳板。
在这里插入图片描述在这里插入图片描述
然后再将ingress-nginx的yaml里的images改成自己的aliyun镜像即可,最后构建即可成功!
在这里插入图片描述

使用方式

以nginx为例,创建三副本,并且修改nginx的主页名称区分开来,并创建service且为ClusterIP类型即可,使用ingress转发进行尾部访问

创建nginx的service和deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: my-dep-nginx
  name: my-dep-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-dep-nginx
  template:
    metadata:
      labels:
        app: my-dep-nginx
    spec:
      containers:
      - image: nginx
        name: nginx
---
apiVersion: v1
kind: Service
metadata:
  name: service-nginx-clusterip
spec:
  type: ClusterIP
  selector:
    app: my-dep-nginx
  ports:
  - port: 3000
    targetPort: 80

创建ingress

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: hello-ingress
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: service-nginx-clusterip
                port:
                  number: 3000

示意图

在这里插入图片描述
在这里插入图片描述

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

image-20230115173455823

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值