发布时间:2025-06-24 01:11:22 作者:北方职教升学中心 阅读量:449
#更新apt源sudoapt-getupdate#使apt支持ssl传输sudoapt-getinstall-yapt-transport-https#下载gpg密钥curlhttps://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg |apt-key add-#添加apt源sudoapt-add-repository "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main"#查看可安装版本sudoapt-cachemadison kubectl#安装指定版本sudoapt-getinstallkubelet=1.23.5-00 kubeadm=1.23.5-00 kubectl=1.23.5-00#阻止自动更新sudoapt-mark hold kubelet kubeadm kubectl
2.4配置Master节点
#查看集群使用的容器镜像kubeadm config images list#拉取所需镜像sudokubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers#初始化#配置项说明:#--apiserver-advertise-address k8s 中服务apiserver的部署地址,如果不填写,默认是本机#--image-repository 拉取的 docker 镜像源,因为初始化的时候kubeadm会去拉 k8s 的很多组件来进行部署,所以需要指定国内镜像源,下不然会拉取不到镜像#--pod-network-cidr k8s采用的节点网络,该参数指定了为pod节点分配的虚拟ip网段#--kubernetes-version: 这个是用来指定你要部署的 k8s 版本的,一般不用填,不过如果初始化过程中出现了因为版本不对导致的安装错误的话,可以用这个参数手动指定kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.23.5 --pod-network-cidr=192.168.0.0/16 --apiserver-advertise-address=192.168.121.130#初始化mkdir-p$HOME/.kube sudocp-i/etc/kubernetes/admin.conf $HOME/.kube/config sudochown$(id-u):$(id-g)$HOME/.kube/config#查看集群节点kubectl get nodes#查看集群状态kubectl get cs#以上步骤安装完后,机器搭建起来了,但状态还是NotReady状态,master机器需要安装网络插件Calico#下面是一个网上别人整理好的资源清单,之间运行k8s会在docker中拉起相应的服务kubectl apply -fhttps://docs.projectcalico.org/v3.21/manifests/calico.yaml#再次查看集群节点,状态变为Readykubectl get nodes#查看集群状态kubectl get cs
输出信息如下,执行其中的mkdir,cp等命令,最后的输出kubeadm join命令用于worker节点加入集群
Your Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/configAlternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.confYou should now deploy a pod network to the cluster.Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/Then you can join any number of worker nodes by running the following on each as root:kubeadm join 192.168.121.130:6443 --token 1uwxx8.zkr71sdz5uu7z2t1 \ --discovery-token-ca-cert-hash sha256:5d0df7efc1d8895ec4c93e7d926738d4311fd36b6f14b18dffbaf4e07d66213d
2.5配置worker节点
#更新apt源sudoapt-getupdate#使apt支持ssl传输sudoapt-getinstall-yapt-transport-https#下载gpg密钥curlhttps://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg |apt-key add-#添加apt源sudoapt-add-repository "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main"#查看可安装版本sudoapt-cachemadison kubectl#安装指定版本sudoapt-getinstallkubelet=1.23.5-00 kubeadm=1.23.5-00 kubectl=1.23.5-00#阻止自动更新sudoapt-mark hold kubelet kubeadm kubectl#加入集群sudokubeadm join192.168.121.130:6443 --token1uwxx8.zkr71sdz5uu7z2t1 \--discovery-token-ca-cert-hash sha256:5d0df7efc1d8895ec4c93e7d926738d4311fd36b6f14b18dffbaf4e07d66213d#查看token和hashkubeadm token listkubeadm token inspect <token名称>#新建tokenkubeadm token create --print-join-command#部署完后在master节点查看kubectl get nodes#输出如下:#NAME STATUS ROLES AGE VERSION#lzy-virtual-machine Ready control-plane,master 35m v1.23.5#worker-node1 Ready <none> 2m7s v1.23.5
3.基本操作
3.1Kubectl使用
环境准备,将主节点的.kube/config文件复制到worker节点中
#使用命令验证kubectl get nodes#查看命令kubectl --help#查看生成的标签kubectl get node--show-labels#给节点node2打上标签env=prodkubectl label nodenode2 env=prod
3.2集群资源清单
用于资源编排
yaml文件组成部分,由控制器定义和被控制对象组成,示例:
#控制器定义apiVersion:apps/v1kind:Deployment #资源类型metadata:name:nginx-deployment namespace:defaultspec:replicas:1#副本数量selector:matchLabels:app:nginx#被控制对象template:#Pod模板metadata:#Pod元数据labels:app:nginx spec:containers:#容器配置-name:nginx #容器名称image:nginx:1.18#容器镜像imagePullPolicy:IfNotPresent #获取镜像的策略ports:#Pod的重启策略-containerPort:80#容器需要监听的端口号 restartPolicy:Always #Pod的重启策略
常用字段说明
参数名 | 数据类型 | 说明 | ||||||
---|---|---|---|---|---|---|---|---|
apiVersion | String | 指k8s API的版本,可以用kubectl api-versions命令查看,一般为v1 | ||||||
kind | String | 指yaml文件定义的资源类型和角色,比如Pod | ||||||
metadata | Object | 元数据对象 | ||||||
metadata.name | String | 元数据对象的名字,这里由我们编写 | ||||||
metadata.namespace | String | 元数据对象的命名空间 | ||||||
spec | Object | 详细定义对象 | ||||||
spec.containers[] | list | 容器列表 | ||||||
spec.containers[].name | String | 容器名 | ||||||
spec.containers[].name | String | 镜像名称 | ||||||
spec.containers[].imagePullPolicy | String | 容器镜像拉取策略,Always、为空值hostPath:string #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录path:string #Pod所在宿主机的目录,将被用于同期中mount的目录secret:#类型为secret的存储卷,挂载集群与定义的secre对象到容器内部scretname:string items:-key:string path:string configMap:#类型为configMap的存储卷,挂载预定义的configMap对象到容器内部name:string items:-key:string文章目录
1.基本概念1.1Master节点apiserver:集群统一入口,以restful方式,交给etcd存储 scheduler:节点调度,选择worker节点应用部署 controller-manager:处理集群中常规后台任务,一个资源对应一个控制器 etcd:存储系统,用于保存集群相关的数据 1.2worker节点kubelet:master派到node节点的代表,管理本机容器 kube-proxy:提供网络代理,负载均衡等操作 1.3Pod
1.4Controller
1.5Service
2.环境搭建安装版本,采用kubeadm搭建,k8s的组件均运行在docker容器中
2.1安装指定版本docker参考docker官网安装教程
2.2关闭swap分区
2.3安装kubeadm、kubectl和kubelet
|
#应用资源清单文件kubectl apply -ffileName.yaml#使用kubectl create命令生成yaml文件kubectl create deployment test--image=nginx:1.18 -oyaml --dry-run >my1.yaml#使用kubectl get命令导出yaml文件#旧版本为kubectl get deploy nginx-app -o=yaml --export > my2.yamlkubectl get deploy nginx-app -o=yaml >my2.yaml
3.3NameSpace
- 实现资源隔离
- 属于逻辑隔离
- 属于管理边界
- 不属于网络边界
- 可以针对每个namespace做资源隔离
#查看命名空间kubectl get namespace#以下为输出#NAME STATUS AGE#default Active 2d17h#kube-node-lease Active 2d17h#kube-public Active 2d17h#kube-system Active 2d17h#其中default为用户创建pod的默认命名空间#kube-public 为所有用户均可访问的命名空间,包括未认证用户#kube-node-lease 为kubernetes集群节点租约状态,v1.13加入#kube-system kubernetes集群使用的命名空间#创建命名空间kubectl create namespace test#删除命名空间kubectl delete namespace test
3.4Pod
一个Pod中的多个容器可以共享存储和网络,可以看作一个逻辑的主机。扩展、
pod实现共享网络机制:Pod中首先自动创建Pause容器(根容器),再创建业务容器,并将业务容器加入根容器,让所有业务容器在同一个namespace中,实现网络共享
pod实现共享存储机制:引入数据卷概念Volumn,实现共享存储
查看pod
#查看podkubectl get pods#或kubectl get pods --namespacedefault#进入podkubectl exec-it[podName]bash
创建pod,以部署nginx应用为例
#拉取镜像sudodockerpull nginx:1.18
资源清单nginx.yaml
apiVersion:v1kind:Podmetadata:name:pod1 namespace:defaultspec:containers:-name:nginx-pod image:nginx:1.18imagePullPolicy:IfNotPresent ports:-name:nginxport containerPort:80
创建pod,创建pod时scheduler会使用调度算法将pod分配给相应的node
#应用资源清单文件kubectl apply -fnginx.yaml#查看是否成功创建kubectl get pods -owide#输出为#NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES#pod1 1/1 Running 0 3m34s 192.168.180.193 worker-node1 <none> <none>#可通过192.168.180.193进行访问#删除podkubectl delete pods pod1 -ndefault
3.5Controller控制器
在集群上管理和运行容器的对象
当pod出现问题时,会把pod重新拉起,以达到用户的期望状态
常见Pod控制器
控制器名称 | 作用 |
---|---|
Deployment | 声明式更新控制器,用于发布无状态应用 |
ReplicaSet | 副本集控制器,用于对Pod进行副本规模扩大或裁剪 |
StatefulSet | 有状态副本集,用于发布有状态应用 |
DaemonSet | 在k8s集群每一个Node上运行一个副本,用于发布监控或日志收集类等应用 |
Job | 运行一次性作业任务 |
CronJob | 运行周期性作业任务 |
#创建Deployment控制器类型应用kubectl apply -fdeployment.yaml#查看kubectl get deployment#删除,使用kubectl delete pods直接删除pod会被重新拉起kubectl delete deployment nginx-app#弹性伸缩kubectl scale deployment nginx-deployment --replicas==2
3.5.1部署无状态应用(Deployment)
- pod之间没有顺序
- 所有pod共享存储
- pod名字包含随机数字
- service都有ClusterIP,可以负载均衡
kubectl apply -fdeployment.yamlkubectl expose deployment nginx-deployment --type=NodePort --target-port=80--port=8000
示例资源清单deployment.yaml
#控制器定义apiVersion:apps/v1kind:Deployment #资源类型metadata:name:nginx-deployment namespace:defaultspec:replicas:1#副本数量selector:matchLabels:app:nginx#被控制对象template:#Pod模板metadata:#Pod元数据labels:app:nginx spec:containers:#容器配置-name:nginx #容器名称image:nginx:1.18#容器镜像imagePullPolicy:IfNotPresent #获取镜像的策略ports:#Pod的重启策略-containerPort:80#容器需要监听的端口号 restartPolicy:Always #Pod的重启策略
3.5.2部署有状态应用(StatefulSet)
- 部署、