首页
关于
留言
接口
搜索
资讯
技术
资源
悦读
杂记
首页
登录
登录
搜索
emer
累计撰写
58
篇文章
累计收到
0
条评论
首页
栏目
资讯
技术
资源
悦读
杂记
首页
登录
页面
首页
关于
留言
接口
腾讯云福利
主机特惠
置顶
k8s学习:蓝绿部署演练
准备工作:把实验镜像包myapp-lan.tar.gz和myapp-lv.tar.gz上传到部署node节点,然后导入到镜像:ctr -n=k8s.io images import myapp-lan.tar.gzctr -n=k8s.io images import myapp-lv.tar.gz1、回到master控制节点创建部署配置文件(yaml配置文件),[root@ctdmaster1 ~]# vim lv.yaml配置代码如下 :apiVersion: apps/v1kind: Deploymentmetadata:name: myapp-v1namespace: blue-greenspec:replicas: 3selector:matchLabels:app: myappversion: v2template:metadata:labels:app: myappversion: v2spec:containers:name: myappimage: janakiramm/myapp:v2imagePullPolicy: IfNotPresentports: containerPort: 802、创建名字空间和deploy资源:[root@ctdmaster1 ~]# kubectl create ns blue-greennamespace/blue-green created[root@ctdmaster1 ~]# kubectl apply -f lv.yaml3、查看pods是否创建成功[root@ctdmaster1 ~]# kubectl get pods -n blue-greenNAME READY STATUS RESTARTS AGEmyapp-v1-75d7db5cf7-467dg 1/1 Running 0 26smyapp-v1-75d7db5cf7-4rx4z 1/1 Running 0 26smyapp-v1-75d7db5cf7-lhgz9 1/1 Running 0 26s4、创建前端Service[root@ctdmaster1 ~]# vim service_lanlv.yaml代码如图:执行更新服务命令:kubectl apply -f service_lanlv.yaml执行命令查看是否更新成功:kubectl get svc -n blue-green在浏览器访问http://k8s-master节点ip:30062如节点的IP为192.168.40.161,则访问下 http://192.168.40.161:30062如节点的IP为192.168.40.162,则访问下 http://192.168.40.162:30062两个节点的效果是一样的。5、创建蓝色部署环境(即新上线的环境,要替代绿色环境)1)、创建部署yaml配置文件vim lan.yaml2)执行部署配置命令:kubectl apply -f lan.yaml 并查看运行结果从图中可以看出蓝色版已经运行成功,但是因为在后台运行,所以前端是访问不了的。此时如果需要切换蓝色版本只需要修改前端的配置文件service_lanlv.yaml即可,如:刷新访问节点1的192.168.40.161:30062前面已经更新为蓝色版本,说明实验成功。总的来说,蓝绿部署就是部署两套一样的环境,一个前台运行,一个后台备用,当需要更新的时候,只要把后台运行的更新测试无误之后,把前端的路由或者代理指向后台更新好的环境, 这样后台变前台,前台变后台,如果前台的出了问题,备用的可以立马顶上,这可最大的减少前端访问宕机故障。
2023年-11月-3日
372 阅读
0 评论
技术
2023-11-3
什么是蓝绿部署
蓝绿部署是一种应用发布模式,可将用户流量从先前版本的应用或微服务逐渐转移到几乎相同的新版本中(两者均保持在生产环境中运行)。旧版本可以称为蓝色环境,而新版本则可称为绿色环境。一旦生产流量从蓝色完全转移到绿色,蓝色就可以在回滚或退出生产的情况下保持待机,也可以更新成为下次更新的模板。这种持续部署模式原本存在不足之处。并非所有环境都具有相同的正常运行时间要求或正确执行 CI/CD 流程(如蓝绿部署)所需的资源。但是,随着企业加大对数字化转型的支持,许多应用开始支持这种持续交付。蓝绿部署是一种应用发布模式,可将用户流量从先前版本的应用或微服务逐渐转移到几乎相同的新版本中(两者均保持在生产环境中运行)。蓝绿部署的优势和缺点优点:1、更新过程无需停机,风险较少2、回滚方便,只需要更改路由或者切换DNS服务器,效率较高缺点:1、成本较高,需要部署两套环境。如果新版本中基础服务出现问题,会瞬间影响全网用户;如果新版本有问题也会影响全网用户。2、需要部署两套机器,费用开销大3、在非隔离的机器(Docker、VM)上操作时,可能会导致蓝绿环境被摧毁风险4、负载均衡器/反向代理/路由/DNS处理不当,将导致流量没有切换过来情况出现
2023年-11月-3日
388 阅读
0 评论
技术
2023-11-3
deployment运行demo代码
Deployment是kubernetes中最常用的资源对象,为ReplicaSet和Pod的创建提供了一种声明式的定义方法,在Deployment对象中描述一个期望的状态,Deployment控制器就会按照一定的控制速率把实际状态改成期望状态,通过定义一个Deployment控制器会创建一个新的ReplicaSet控制器,通过ReplicaSet创建pod,删除Deployment控制器,也会删除Deployment控制器下对应的ReplicaSet控制器和pod资源.使用Deployment而不直接创建ReplicaSet是因为Deployment对象拥有许多ReplicaSet没有的特性,例如滚动升级、金丝雀发布、蓝绿部署和回滚。扩展:声明式定义是指直接修改资源清单yaml文件,然后通过kubectl apply -f 资源清单yaml文件,就可以更改资源。apiVersion: apps/v1kind: Deploymentmetadata: name: myapp-v1spec: replicas: 3 selector: matchLabels: app: myapp version: v1 template: metadata: labels: app: myapp version: v1 spec: containers: - name: myapp image: janakiramm/myapp:v2 imagePullPolicy: IfNotPresent ports: - containerPort: 80 version: v1 template: metadata: labels: app: myapp version: v1 spec: containers: - name: myapp image: janakiramm/myapp:v2 imagePullPolicy: IfNotPresent ports: - containerPort: 80 startupProbe: periodSeconds: 5 initialDelaySeconds: 20 timeoutSeconds: 10 httpGet: scheme: HTTP port: 80 path: / livenessProbe: periodSeconds: 5 initialDelaySeconds: 20 timeoutSeconds: 10 httpGet: scheme: HTTP port: 80 path: / readinessProbe: periodSeconds: 5 initialDelaySeconds: 20 timeoutSeconds: 10 httpGet: scheme: HTTP port: 80 path: /
2023年-11月-3日
374 阅读
0 评论
技术
置顶
kubernetes的查询操作命令
1、kubectl get all -o wide -A 【查询所有命名空间下常用资源】缺点:这种方法 kubectl get all 其实查询出来不是全部资源,仅仅是常用资源,仅仅是 service - deployment/statefulset/daemonset/job/cronjob - replicaset - pod 这个绑定链资源,还有 rbac 的 role rolebinding,配置文件 configmap secrets,服务账号 serviceAccount ,service与pod的绑定endpoints都没有查询出来2、kubectl api-versions 【查看所有apiVersion版本】3、kubectl api-resources 【查看所有资源类型】4、kubectl api-resources --verbs=list --namespaced -o name5、kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get --show-kind --ignore-not-found -A #查询所有命名空间下的所有资源
2023年-11月-2日
362 阅读
0 评论
技术
2023-11-1
关于名字空间(Namespace)
在 Kubernetes 中,名字空间(Namespace) 提供一种机制,将同一集群中的资源划分为相互隔离的组。 同一名字空间内的资源名称要唯一,但跨名字空间时没有这个要求。 名字空间作用域仅针对带有名字空间的对象, (例如 Deployment、Service 等),这种作用域对集群范围的对象 (例如 StorageClass、Node、PersistentVolume 等)不适用。名字空间为名称提供了一个范围。资源的名称需要在名字空间内是唯一的,但不能跨名字空间。 名字空间不能相互嵌套,每个 Kubernetes 资源只能在一个名字空间中。名字空间是在多个用户之间划分集群资源的一种方法,而当名字空间中存在一个 ResourceQuota 对象时,对于该名字空间而言,资源配额就是开启的。当名字空间资源配额开启时,在空间里创建的Pod或者应用资源时必须必须设置资源限额,否则创建失败。Kubernetes 初始化启动时会自动创建四个名字空间:1、default:Kubernetes 包含这个名字空间,以便于你无需创建新的名字空间即可开始使用新集群。2、kube-node-lease:该名字空间包含用于与各个节点关联的 Lease(租约)对象。 节点租约允许 kubelet 发送心跳, 由此控制面能够检测到节点故障。3、kube-public:所有的客户端(包括未经身份验证的客户端)都可以读取该名字空间。 该名字空间主要预留为集群使用,以便某些资源需要在整个集群中可见可读。 该名字空间的公共属性只是一种约定而非要求。4、kube-system:该名字空间用于 Kubernetes 系统创建的对象有关名字空间的常用命令:1、创建名字空间kubectl create ns test2、获取当前名字空间列表kubectl get namespace/ns[root@ctdmaster1 ~]# kubectl get namespaceNAME STATUS AGEdefault Active 11dkube-node-lease Active 11dkube-public Active 11dkube-system Active 11dtest Active 11d3、删除名字空间kubectl delete namespaces 名字空间名此命令会删除名字空间下的 所有内容,谨慎操作 ![root@ctdmaster1 ~]# kubectl get nsNAME STATUS AGEdefault Active 11dkube-node-lease Active 11dkube-public Active 11dkube-system Active 11dtest Active 11d[root@ctdmaster1 ~]# kubectl get pods -n testNAME READY STATUS RESTARTS AGEpod-test 1/1 Running 0 158m[root@ctdmaster1 ~]# kubectl delete ns testnamespace "test" deleted[root@ctdmaster1 ~]# kubectl get pods -n testNo resources found in test namespace.[root@ctdmaster1 ~]# kubectl get nsNAME STATUS AGEdefault Active 11dkube-node-lease Active 11dkube-public Active 11dkube-system Active 11d 4、分析名字空间详细信息kubectl describe namespaces [root@ctdmaster1 ~]# kubectl describe ns testName: testLabels: kubernetes.io/metadata.name=testAnnotations: <none>Status: ActiveNo resource quota.No LimitRange resource.5、创建资源配额[root@ctdmaster1 ~]# vim namespace-quota.yaml #以下为资源配额内容apiVersion: v1kind: ResourceQuotametadata: name: mem-cpu-quota namespace: testspec: hard: requests.cpu: "2" requests.memory: 2Gi limits.cpu: "4" limits.memory: 4Gi执行命令:[root@ctdmaster1 ~]# kubectl apply -f namespace-quota.yaml 查看名字空间配额[root@ctdmaster1 ~]# kubectl describe ns testName: testLabels: kubernetes.io/metadata.name=testAnnotations: <none>Status: ActiveResource Quotas Name: mem-cpu-quota Resource Used Hard -------- --- --- limits.cpu 0 4 limits.memory 0 4Gi requests.cpu 0 2 requests.memory 0 2GiNo LimitRange resource.最后需要注意的是 kubernetes 资源(例如 Pod、Service、副本控制器等)都位于某些名字空间中。 但是名字空间资源本身并不在名字空间中,而且底层资源, 例如节点和持久化卷不属于任何名字空间。查看哪些 Kubernetes 资源在名字空间中,哪些不在名字空间中:# 位于名字空间中的资源kubectl api-resources --namespaced=true 不在名字空间中的资源kubectl api-resources --namespaced=false
2023年-11月-1日
237 阅读
0 评论
技术
2023-10-28
Kubernetes docker Containerd ctr、crictl、nerdctl -容器和镜像操作命令工具【转】
一、概述作为接替 Docker 运行时的 Containerd 在早在 Kubernetes1.7 时就能直接与 Kubelet 集成使用,只是大部分时候我们因熟悉 Docker,在部署集群时采用了默认的 dockershim。在V1.24起的版本的 kubelet 就彻底移除了dockershim,改为默认使用Containerd了,当然也使用 cri-dockerd 适配器来将 Docker Engine 与 Kubernetes 集成。可以参考官方文档:https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/#docker二、Containerd 常见命令操作更换 Containerd 后,以往我们常用的 docker 命令也不再使用,取而代之的分别是 crictl 和 ctr 两个命令客户端。crictl 是遵循 CRI 接口规范的一个命令行工具,通常用它来检查和管理kubelet节点上的容器运行时和镜像。ctr 是 containerd 的一个客户端工具。ctr -v 输出的是 containerd 的版本,crictl -v 输出的是当前 k8s 的版本,从结果显而易见你可以认为 crictl 是用于 k8s 的。一般来说你某个主机安装了 k8s 后,命令行才会有 crictl 命令。而 ctr 是跟 k8s 无关的,你主机安装了 containerd 服务后就可以操作 ctr 命令。使用crictl命令之前,需要先配置/etc/crictl.yaml如下:runtime-endpoint: unix:///run/containerd/containerd.sockimage-endpoint: unix:///run/containerd/containerd.socktimeout: 10debug: false或者使用命令:crictl config runtime-endpoint unix:///run/containerd/containerd.sockcrictl config image-endpoint unix:///run/containerd/containerd.sockdocker ctr crictl三种命令对比图由于 Containerd 也有 namespaces 的概念,对于上层编排系统的支持,ctr 客户端 主要区分了 3 个命名空间分别是k8s.io、moby和default,以上我们用crictl操作的均在k8s.io命名空间,使用ctr 看镜像列表就需要加上-n 参数。crictl 是只有一个k8s.io命名空间,但是没有-n 参数。【温馨提示】ctr images pull 拉取的镜像默认放在default,而 crictl pull 和 kubelet 默认拉取的镜像都在 k8s.io 命名空间下。所以通过ctr导入镜像的时候特别注意一点,最好指定命名空间。注意-n不能放在命令最后面,下面几行查看的镜像是一样的ctr -n=k8s.io image lsctr -n k8s.io image lscrictl 没有-n参数,操作都在k8s.io命名空间下。crictl image lscrictl imagescrictl image list = ctr -n=k8s.io image listcrictl image ls = ctr -n=k8s.io image lscrictl images = ctr -n=k8s.io image listcrictl images = ctr -n=k8s.io image ls使用ctr命令指定命名空间导入镜像ctr -n=k8s.io image import dashboard.tar查看镜像,可以看到可以查询到了crictl images三、containerd 客户端工具 nerdctl推荐使用 nerdctl,使用效果与 docker 命令的语法一致,github 下载链接:https://github.com/containerd/nerdctl/releases精简 (nerdctl–linux-amd64.tar.gz): 只包含 nerdctl完整 (nerdctl-full–linux-amd64.tar.gz): 包含 containerd, runc, and CNI 等依赖nerdctl 的目标并不是单纯地复制 docker 的功能,它还实现了很多 docker 不具备的功能,例如延迟拉取镜像(lazy-pulling)、镜像加密(imgcrypt)等。具体看 nerdctl。延迟拉取镜像功能可以参考这篇文章:Containerd 使用 Stargz Snapshotter 延迟拉取镜像https://icloudnative.io/posts/startup-containers-in-lightning-speed-with-lazy-image-distribution-on-containerd/1)安装 nerdctl(精简版)wget https://github.com/containerd/nerdctl/releases/download/v0.22.2/nerdctl-0.22.2-linux-amd64.tar.gz解压tar -xf nerdctl-0.22.2-linux-amd64.tar.gzln -s /opt/k8s/nerdctl/nerdctl /usr/local/bin/nerdctl2)安装 nerdctl(完整版,这里不装)wget https://github.com/containerd/nerdctl/releases/download/v0.22.2/nerdctl-full-0.22.2-linux-amd64.tar.gztar -xf nerdctl-full-0.16.0-linux-amd64.tar.gz -C /usr/local/cp /usr/local/lib/systemd/system/*.service /etc/systemd/system/启动服务 buildkitsystemctl enable buildkit containerd --nowsystemctl status buildkit containerd3)安装 buildkit 支持构建镜像buildkit GitHub 地址:https://github.com/moby/buildkit使用精简版 nerdctl 无法直接通过 containerd 构建镜像,需要与 buildkit 组全使用以实现镜像构建。当然你也可以安装上面的完整 nerdctl;buildkit 项目是 Docker 公司开源出来的一个构建工具包,支持 OCI 标准的镜像构建。它主要包含以下部分:服务端 buildkitd,当前支持 runc 和 containerd 作为 worker,默认是 runc;客户端 buildctl,负责解析 Dockerfile,并向服务端 buildkitd 发出构建请求。buildkit 是典型的C/S 架构,client 和 server 可以不在一台服务器上。而 nerdctl 在构建镜像方面也可以作为 buildkitd 的客户端。https://github.com/moby/buildkit/releaseswget https://github.com/moby/buildkit/releases/download/v0.10.4/buildkit-v0.10.4.linux-amd64.tar.gztar -xf buildkit-v0.10.4.linux-amd64.tar.gz -C /usr/local/配置 buildkit 的启动文件,可以从这里下载:https://github.com/moby/buildkit/tree/master/examples/systemdbuildkit 需要配置两个文件/usr/lib/systemd/system/buildkit.socketcat > /usr/lib/systemd/system/buildkit.socket <<EOF[Unit]Description=BuildKitDocumentation=https://github.com/moby/buildkit[Socket]ListenStream=%t/buildkit/buildkitd.sockSocketMode=0660[Install]WantedBy=sockets.targetEOF/usr/lib/systemd/system/buildkit.servicecat > /usr/lib/systemd/system/buildkit.service << EOF[Unit]Description=BuildKitRequires=buildkit.socketAfter=buildkit.socketDocumentation=https://github.com/moby/buildkit[Service]Replace runc builds with containerd buildsExecStart=/usr/local/bin/buildkitd --addr fd://[Install]WantedBy=multi-user.targetEOFsystemctl daemon-reloadsystemctl enable buildkit --now四、实战操作1)修改 containerd 配置文件配置如下:[plugins.“io.containerd.grpc.v1.cri”.registry]config_path = “”[plugins."io.containerd.grpc.v1.cri".registry.auths] [plugins."io.containerd.grpc.v1.cri".registry.configs] [plugins."io.containerd.grpc.v1.cri".registry.configs."myharbor-minio.com".tls] insecure_skip_verify = true #跳过认证 ca_file = "/etc/containerd/myharbor-minio.com/ca.crt" [plugins."io.containerd.grpc.v1.cri".registry.configs."myharbor-minio.com".auth] username = "admin" password = "Harbor12345" [plugins."io.containerd.grpc.v1.cri".registry.headers] [plugins."io.containerd.grpc.v1.cri".registry.mirrors] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."myharbor-minio.com"] endpoint = ["https://myharbor-minio.com"]重新加载配置systemctl daemon-reload重启containerdsystemctl restart containerd注意:这个配置文件是给crictl和kubelet使用,ctr是不可以用这个配置文件的,ctr 不使用 CRI,因此它不读取 plugins."io.containerd.grpc.v1.cri"配置2)ctr 拉取推送镜像推送镜像到harborctr --namespace=k8s.io images push myharbor-minio.com/bigdata/minio:2022.8.22-debian-11-r0 --skip-verify --user admin:Harbor12345–namespace=k8s.io 指定命名空间,不是必须,根据环境而定–skip-verify 跳过认证–user 指定harbor用户名及密码ctr images pull --user admin:Harbor12345 --tlscacert=/etc/containerd/myharbor-minio.com/ca.crt myharbor-minio.com/bigdata/minio:2022.8.22-debian-11-r0不想-u user:password 每次必须使用 ctr pull/ctr push, 可以使用nerdctl 。3)镜像构建cat > Dockerfile <<EOFFROM nginx:alpineRUN echo ‘Hello Nerdctl From Containerd’ > /usr/share/nginx/html/index.htmlEOF然后在文件所在目录执行镜像构建命令:不加-n指定命名空间,crictl看不到,kubelet也不能使用它,默认在default命名空间下nerdctl -n k8s.io build -t nginx:nerctl -f ./Dockerfile .参数解释-t:指定镜像名称. :当前目录Dockerfile-f:指定Dockerfile路径–no-cache:不缓存4)打标签 tagcrictl没有tag命令,只能使用nerdctl和ctr,必须指定命名空间,要不然kubelet无法使用。ctr -n k8s.io i tagnerdctl -n k8s.io tag nginx:nerctl myharbor-minio.com/bigdata/nginx:nerctlctr -n k8s.io tag nginx:nerctl myharbor-minio.com/bigdata/nginx:nerctl查看镜像nerdctl -n k8s.io images myharbor-minio.com/bigdata/nginx:nerctl5)将镜像推送到 Harbor第一种情况:http方式,配置如下:以下两个哪个都可以mkdir -p /etc/docker/certs.d/myharbor-minio.com:443mkdir -p /etc/containerd/certs.d/myharbor-minio.com:443cat > /etc/containerd/certs.d/myharbor-minio.com:443/hosts.toml <<EOFserver = “https://docker.io”[host.“http://myharbor-minio.com:80”]capabilities = [“pull”, “resolve”,“push”]skip_verify = trueca = “ca.crt” #相对路径ca = “/opt/auth/ca.crt” #绝对路径ca = [“/opt/auth/ca.crt”]ca = [“ca.crt”]client = [[“/opt/auth/nginx.cclinux.cn.crt”, “/opt/auth/nginx.cclinux.cn.key”]]EOF第二种情况:https方式,配置如下:以下两个哪个都可以mkdir -p /etc/docker/certs.d/myharbor-minio.com:443mkdir -p /etc/containerd/certs.d/myharbor-minio.com:443cat > /etc/containerd/certs.d/myharbor-minio.com:443/hosts.toml <<EOFserver = “https://docker.io”[host.“https://myharbor-minio.com:443”]capabilities = [“pull”, “resolve”,“push”]skip_verify = trueca = “ca.crt” #相对路径ca = “/opt/auth/ca.crt” #绝对路径ca = [“/opt/auth/ca.crt”]ca = [“/etc/containerd/myharbor-minio.com/ca.crt”]client = [[“/opt/auth/nginx.cclinux.cn.crt”, “/opt/auth/nginx.cclinux.cn.key”]]EOF通过 nerdctl 登录 harborecho Harbor12345 | nerdctl login --username “admin” --password-stdin myharbor-minio.com:443nerdctl login --username “admin” --password Harbor12345 myharbor-minio.com:443登出nerdctl logout开始将镜像推送到 harbor推送到Harbor–insecure-registry skips verifying HTTPS certs, and allows falling back to plain HTTPnerdctl --insecure-registry --namespace=k8s.io push myharbor-minio.com/bigdata/nginx:nerctlctr --namespace=k8s.io images push myharbor-minio.com/bigdata/nginx:nerctl --skip-verify --user admin:Harbor12345–namespace=k8s.io 指定命名空间,跟-n一样,不是必须,根据环境而定–skip-verify 跳过认证–user 指定harbor用户名及密码————————————————版权声明:本文为CSDN博主「稚辉君.MCA.P8.JAVA高级架构师」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/m0_37843156/article/details/128277966
2023年-10月-28日
634 阅读
0 评论
技术
2023-10-28
k8s 中的三种容器探测方法
k8s 中的三种容器探测方法:启动探测、存活探测、就绪探测1、启动探测 startupProbe:探测容器中的应用是否已经启动。如果提供了启动探测(startup probe),则禁用所有其他探测,直到它成功为止。如果启动探测失败,kubelet 将杀死容器,容器服从其重启策略进行重启。如果容器没有提供启动探测,则默认状态为成功Success。2、存活探测 livenessprobe:用指定的方式(exec、tcp、http)检测pod中的容器是否正常运行,如果检测失败,则认为容器不健康,那么Kubelet将根据Pod中设置的 restartPolicy策略来判断Pod 是否要进行重启操作,如果容器配置中没有配置 livenessProbe,Kubelet 将认为存活探针探测一直为success(成功)状态。3、就绪探测 readnessprobe:就绪性探针,用于检测容器中的应用是否可以接受请求,当探测成功后才使Pod对外提供网络访问,将容器标记为就绪状态,可以加到pod前端负载,如果探测失败,则将容器标记为未就绪状态,会把pod从前端负载移除。我们可以自定义在pod启动时是否执行这些检测,如果不设置,则检测结果均默认为通过,如果设置,则顺序为startupProbe>readinessProbe和livenessProbe,其中readinessProbe和livenessProbe是并发关系,官方文档是是这样描述的:Caution: Liveness probes do not wait for readiness probes to succeed. If you want to wait before executing a liveness probe you should use initialDelaySeconds or a startupProbe以上三种探测方法都支持下面三种探针:1、exec:在容器中执行指定的命令,如果执行成功,退出码为 0 则探测成功。2、TCPSocket:通过容器的 IP 地址和端口号执行 TCP 检 查,如果能够建立 TCP 连接,则表明容器健康。3、HTTPGet:通过容器的IP地址、端口号及路径调用 HTTP Get方法,如果响应的状态码大于等于200且小于400,则认为容器健康通常探针探测结果有以下值:1、Success:表示通过检测。2、Failure:表示未通过检测。3、Unknown:表示检测没有正常进行。Pod探针相关的属性:探针(Probe)有许多可选字段,可以用来更加精确的控制Liveness和Readiness两种探针的行为initialDelaySeconds:容器启动后要等待多少秒后探针开始工作,单位“秒”,默认是 0 秒,最小值是 0periodSeconds: 执行探测的时间间隔(单位是秒),默认为 10s,单位“秒”,最小值是1timeoutSeconds: 探针执行检测请求后,等待响应的超时时间,默认为1,单位“秒”。successThreshold:连续探测几次成功,才认为探测成功,默认为 1,在 Liveness 探针中必须为1,最小值为1。failureThreshold: 探测失败的重试次数,重试一定次数后将认为失败,在 readiness 探针中,Pod会被标记为未就绪,默认为 3,最小值为 1两种探针区别:ReadinessProbe 和 livenessProbe 可以使用相同探测方式,只是对 Pod 的处置方式不同:readinessProbe 当检测失败后,将 Pod 的 IP:Port 从对应的 EndPoint 列表中删除。livenessProbe 当检测失败后,将杀死容器并根据 Pod 的重启策略来决定作出对应的措施。
2023年-10月-28日
496 阅读
0 评论
技术
2023-10-28
一些与Pod相关的kubectl命令
kubectl是Kubernetes的命令行工具,主要使用 Kubernetes API 与 Kubernetes 集群的控制面进行通信的管理命令。以下是一些与Pod相关的常用命令:1、创建Pod: kubectl create用于创建pod,如要创建名为pod-test的Pod,可以使用以下命令kubectl create pod pod-test --image=tomcat #将为以tomcat镜像创建一个名为pod-test的Pod2、获取Pod信息: kubectl get pods3、查看Pod日志信息:kubectl logs Pod名4、进入Pod: kubectl exec -it Pod名 -- /bin/bash5、删除Pod:1)利用Pod名直接删除: kubectl delete pod Pod名2) 利用Pod配置yaml文件删除: kubectl delete -f Pod-yaml文件名.yaml3) 强制删除某个Pod:kubectl delete pod xxx --force --grace-period=04)删除所有pods: kubectl delete pods --all6、查看分析Pod: kubectl describe pod Pod名kubectl describe pod pod-name7、更新Pod: kubectl apply -f podname.yaml此命令也可以用于指定Pod配置yaml文件创建Pod8、暂停和恢复Pod暂停Pod:kubectl pause pod pod名恢复Pod:kubectl unpause pod pod名9、手动扩容和缩减pod: kubectl scale如想要将Pod的副本扩大到6个,以下尝试以下命令kubectl scale --replicas=6 deployment/pod名10、导入导出Pod:导出Pod: kubectl export pod Pod名 --output=Pod名.yaml11、查看Pod的CPU和内存资源使用(需要安装metric-server组件)kubectl top pods
2023年-10月-28日
280 阅读
0 评论
技术
2023-10-27
OpenStack和Kubernetes(k8s)的区别理解
OpenStack和Kubernetes(k8s)都是开源的云计算平台,但它们的设计和目的略有不同。OpenStack是一个云基础设施平台,旨在提供计算、存储和网络资源的管理,以构建和管理私有、公有和混合云。OpenStack提供了一系列的服务,如Nova(计算服务)、Cinder(块存储服务)、Neutron(网络服务)等,可以用于构建和管理基础设施。Kubernetes是一个容器编排平台,旨在管理和编排容器化应用程序。它提供了一种在集群中运行、调度和管理容器化应用程序的方式。Kubernetes通过使用Pod、Service、Deployment等资源对象,为应用程序提供了弹性、可伸缩性和高可用性。因此,OpenStack主要关注基础设施层面,而Kubernetes主要关注应用程序层面。它们可以在不同的层面为云计算提供支持,同时也可以在某些情况下协同工作。OpenStack和Kubernetes(简称K8s)都是非常流行的开源云平台,但它们的目标和设计原则有所不同,因此具有不同的优缺点。OpenStack是一种基于虚拟机的云平台,主要用于创建和管理虚拟机、存储、网络等基础设施资源。它提供了各种组件,如Nova、Cinder、Glance等,用于管理这些资源。OpenStack的优点包括:灵活性:OpenStack提供了丰富的API和插件,可以轻松地与其他系统和工具进行集成和扩展。多租户:OpenStack支持多租户,可以让不同的用户和组织共享相同的基础设施资源,从而提高资源利用率。安全性:OpenStack提供了强大的安全功能,如访问控制、身份验证、审计等,以保护云环境中的敏感数据和工作负载。开放性:OpenStack 是一个完全开源的项目,任何人都可以下载、使用和修改代码。高度可定制性:OpenStack 提供了广泛的配置选项和可插拔的架构,可以根据实际需求进行定制。大规模部署:OpenStack 适合用于大规模部署,可以管理数千个服务器和虚拟机。多样化的服务:OpenStack 提供了多种服务,包括计算、存储、网络和安全等,可以满足各种不同的需求。成熟的生态系统:OpenStack 有着成熟的生态系统,包括丰富的第三方工具和插件,可以帮助用户快速搭建自己的云环境。但OpenStack也存在一些缺点:复杂性:OpenStack是一个非常复杂的平台,需要大量的配置和管理工作,因此需要专业的技术人员来维护和管理。资源消耗:由于OpenStack是基于虚拟机的,因此会消耗大量的计算和存储资源,这可能会影响整个系统的性能。性能限制:虚拟机的性能可能受到物理硬件的限制,因此在某些情况下,OpenStack可能无法提供与原生硬件相同的性能,另外在处理大规模数据和高负载时,也有可能会出现性能问题Kubernetes是一种基于容器的云平台,主要用于创建和管理容器化的应用程序。它提供了各种组件,如Pod、Service、Deployment等,用于管理容器和应用程序。Kubernetes的优点包括:自动化管理:Kubernetes 可以自动化地管理容器的部署、伸缩和故障恢复等过程,降低了人工操作的成本和风险。可移植性:Kubernetes支持多云环境和混合云环境,可以轻松地将应用程序移植到不同的云环境中。高可用性:Kubernetes提供了强大的自动化功能,如自动重启、自动缩放等,可以确保应用程序始终可用。容器编排:Kubernetes 提供了强大的容器编排功能,可以灵活地管理多个容器之间的关系和交互。简单易用:Kubernetes 提供了简单易用的命令行工具和 Web 界面,使得用户可以轻松地进行管理和操作。大规模部署:Kubernetes 可以处理数千个节点和容器的管理,适合于大规模部署。但Kubernetes也存在一些缺点:复杂性:虽然Kubernetes比OpenStack简单,但它仍然是一个非常复杂的平台,需要专业的技术人员来管理和维护。部署难度大:部署K8s需要具备一定的技术水平,需要熟悉其各个组件的配置和交互方式,对于初学者来说存在一定的门槛。网络性能问题:在K8s中,容器之间的网络通信需要通过overlay网络实现,会对网络性能产生一定影响。存储管理问题:K8s对于存储的管理支持不够完善,对于分布式存储的管理存在一定问题。openstack容器化基于容器的可移植性优势,openstack也可以将容器化应用到项目维护当中:OpenStack容器化是将OpenStack服务组件以及相关依赖项和数据库都打包成Docker镜像的过程,以便在Kubernetes集群中进行部署和管理。这种方式可以简化OpenStack的安装和升级过程,并提高OpenStack的可移植性和可扩展性。OpenStack和Kubernetes结合部署可以将OpenStack作为基础设施管理平台,将Kubernetes作为容器编排平台,从而实现容器化应用的快速部署和管理。下面是OpenStack和Kubernetes结合部署的优点和步骤:优点:容器编排和基础设施管理的集成。OpenStack提供的资源管理能力可以为Kubernetes提供基础设施的支持,例如存储、网络、安全等功能,使得Kubernetes可以更好地管理应用容器。增强了应用的可伸缩性和弹性。Kubernetes可以根据应用的需要自动扩展和收缩容器数量,OpenStack可以提供资源池和自动化资源调度等功能,从而使得应用具备更好的可伸缩性和弹性。便于应用部署和管理。通过结合OpenStack和Kubernetes,应用可以更快地部署和管理,同时可以更加灵活地管理应用的生命周期。步骤:配置OpenStack环境。安装OpenStack所需的基础环境,例如数据库、消息队列、虚拟化平台等。部署OpenStack组件。安装OpenStack的各个组件,例如Keystone、Nova、Neutron、Glance等。配置Kubernetes环境。安装Kubernetes所需的基础环境,例如etcd、Docker、Kubernetes二进制文件等。部署Kubernetes组件。安装Kubernetes的各个组件,例如kube-apiserver、kube-controller-manager、kube-scheduler等。集成OpenStack和Kubernetes。使用Kubernetes的OpenStack云提供商接口,将Kubernetes和OpenStack集成起来,从而使得Kubernetes可以使用OpenStack提供的资源管理能力。部署应用。使用Kubernetes的yaml文件描述应用,从而实现应用容器的部署和管理。需要注意的是,OpenStack和Kubernetes的结合部署需要考虑一些安全性和性能问题,例如安全认证、网络隔离、负载均衡等。此外,由于OpenStack和Kubernetes的复杂性较高,部署和管理也需要较高的技术水平和经验。
2023年-10月-27日
222 阅读
0 评论
技术
2023-10-27
K8s集群安装记录及证书更新(1.20.6 docker版)
1、升级系统到centos7.9.2009yum update -y2、修改主机名以示区分(不要带特别符号,最好是字母+数字即可)hostnamectl set-hostname XXXX1 &&/bin/bash[root@centos7demo ~]# hostnamectl set-hostname node1&&/bin/bash3、修改网卡IP[root@master1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33注:/etc/sysconfig/network-scripts/ifcfg-ens33文件里的配置说明:NAME=ens33 #网卡名字,跟DEVICE名字保持一致即可DEVICE=ens33 #网卡设备名,大家ip addr可看到自己的这个网卡设备名,每个人的机器可能这个名字不一样,需要写自己的BOOTPROTO=static #static表示静态ip地址ONBOOT=yes #开机自启动网络,必须是yesIPADDR=192.168.40.180 #ip地址,需要跟自己电脑所在网段一致NETMASK=255.255.255.0 #子网掩码,需要跟自己电脑所在网段一致GATEWAY=192.168.40.2 #网关,在自己电脑打开cmd,输入ipconfig /all可看到DNS1=192.168.40.2 #DNS,在自己电脑打开cmd,输入ipconfig /all可看到 4、检查selinux是否关闭[root@master1 ~]# getenforceDisabled #显示Disabled说明selinux已经关闭,如果是如果未关闭,需要执行命令修改:sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config注意:修改selinux配置文件之后,重启机器,selinux配置才会生效5、配置主机hosts文件,相互之间通过主机名互相访问,修改每台机器的/etc/hosts文件,增加如下三行:192.168.40.180 master1192.168.40.181 master2192.168.40.182 node16、配置主机间免密码登陆a、在master1主机执行:[root@master1 ~]# ssh-keygen -t rsa[root@master1 ~]# ssh-copy-id master1[root@master1 ~]# ssh-copy-id master2[root@master1 ~]# ssh-copy-id node1在master2主机执行:[root@master2 ~]# ssh-keygen -t rsa[root@master2 ~]# ssh-copy-id master2[root@master2 ~]# ssh-copy-id master1[root@master2 ~]# ssh-copy-id node1在node1主机执行:[root@node1 ~]#ssh-keygen -t rsa[root@node1 ~]# ssh-copy-id node1[root@node1 ~]# ssh-copy-id master1[root@node1 ~]# ssh-copy-id master2测试 :ssh + 主机名[root@master2 ~]# ssh master1Last login: Fri Oct 13 21:16:02 2023 from node1[root@master1 ~]# 7、关闭交换分区:a、#临时关闭 swapoff -ab、直接注释掉/etc/fstab 的交换分区挂载,重启后自动生效问题:为什么要关闭swap交换分区?答: Swap的交换分区是硬盘划分出来的,当如果机器内存不够,会使用swap分区,但是swap分区的性能相对内存要低很多,k8s设计的时候为了能提升性能,默认是不允许使用交换分区的。Kubeadm初始化的时候会检测swap是否关闭,如果没关闭,那就会导致初始化失败。如果不想要关闭交换分区,安装k8s的时候可以指定--ignore-preflight-errors=Swap来解决。 8、修改机器内核参数[root@master1 ~]# modprobe br_netfilter[root@master1 ~]# cat /etc/profile[root@master1 ~]# echo "modprobe br_netfilter" >> /etc/profile[root@master1 ~]# cat > /etc/sysctl.d/k8s.conf <<EOFnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1net.ipv4.ip_forward = 1EOF[root@master1 ~]# cat /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1net.ipv4.ip_forward = 1同理其他两台主机操作类似,加载内核配置文件,[root@master1 ~]# sysctl -p /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1net.ipv4.ip_forward = 19、关闭firewalld防火墙并设置为不再随机启动:systemctl stop firewalld ; systemctl disable firewalld10、配置阿里云的repo源安装rzsz命令:[root@master1 ~]# yum install lrzsz -y安装scp:[root@master1 ~]# yum install openssh-clients -y备份基础repo源[root@master1 ~]# cd /etc/yum.repos.d/[root@master1 yum.repos.d]# mkdir /root/repo.bak[root@master1 yum.repos.d]# mv * /root/repo.bak/下载阿里云的repo源把资料包里的CentOS-Base.repo和epel.repo文件上传到master1主机的/etc/yum.repos.d/目录下或者从网上下载。master2和node1节点的配置可以采用类似操作。也可以备份好原yum源,删除旧yum文件,直接从master1上复制到master2和node1上[root@master1 yum.repos.d]# scp CentOS-Base.repo epel.repo master2:/etc/yum.repos.dCentOS-Base.repo 100% 2523 3.1MB/s 00:00epel.repo 100% 1050 1.2MB/s 00:00[root@master1 yum.repos.d]# scp CentOS-Base.repo epel.repo node1:/etc/yum.repos.dCentOS-Base.repo 100% 2523 1.5MB/s 00:00epel.repo 配置国内阿里云docker的repo源1、安装yum-utils ,命令:yum install yum-utils -y.=2、下载安装docker的repo源 :yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo[root@master1 yum.repos.d]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo已加载插件:fastestmirroradding repo from: http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repograbbing file http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.reporepo saved to /etc/yum.repos.d/docker-ce.repo3、配置安装k8s组件需要的阿里云的repo源 11、配置时间同步(1、#安装时间同步命令ntpdate[root@master1 yum.repos.d]# yum install ntpdate -y(2、执行同步命令:[root@master1 yum.repos.d]# ntpdate cn.pool.ntp.org14 Oct 00:35:14 ntpdate[9954]: no server suitable for synchronization found(3、编写计划任务,每隔一小时同步一次(所有主机节点一样的规则)[root@master1 yum.repos.d]# crontab -e[root@master1 yum.repos.d]# crontab -l/1 /usr/sbin/ntpdate cn.pool.ntp.org(4、#重启crond服务[root@node1 ~]#service crond restart12 安装基础软件包三台主机可以时执行:yum install -y yum-utils device-mapper-persistent-data lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack ntpdate telnet ipvsadm遇到问题:警告:/var/cache/yum/x86_64/7/epel/packages/epel-release-7-14.noarch.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID 352c64e5: NOKEY从 file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 检索密钥获取 GPG 密钥失败:[Errno 14] curl#37 - "Couldn't open file /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7"解决办法:缺失RPM-GPG-KEY-EPEL-7,进入目录直接wget下载cd /etc/pki/rpm-gpgwget https://archive.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7需要执行清理命令:yum clean all然后就可以正常安装了。13、安装docker服务,docker-ce的20.10.6版本安装命令:yum install docker-ce-20.10.6 docker-ce-cli-20.10.6 containerd.io -y启动docker,设置为开机启动并查看当前docker情况:systemctl start docker && systemctl enable docker && systemctl status docker14、配置docker镜像加速器和驱动[root@master1 ~]# vim /etc/docker/daemon.json {"registry-mirrors":["https://w70c62mv.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com","http://qtid6917.mirror.aliyuncs.com", "https://rncxm540.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"]}保存退出来,scp命令复制到master2和node1,scp daemon.json master2:/etc/dockerscp daemon.json node1:/etc/docker修改docker文件驱动为systemd,默认为cgroupfs,kubelet默认使用systemd,两者必须一致才可以。[root@master1 ~]# systemctl daemon-reload&&systemctl restart docker[root@master1 ~]# systemctl status docker14、安装初始化k8s需要的软件包发送安装命令到三台机器 ,yum install -y kubelet-1.20.6 kubeadm-1.20.6 kubectl-1.20.6[root@master1 ~]# yum install -y kubelet-1.20.6 kubeadm-1.20.6 kubectl-1.20.6[root@master2 ~]# yum install -y kubelet-1.20.6 kubeadm-1.20.6 kubectl-1.20.6[root@node1 ~]# yum install -y kubelet-1.20.6 kubeadm-1.20.6 kubectl-1.20.6注:每个软件包的作用Kubeadm: kubeadm是一个工具,用来初始化k8s集群的kubelet: 安装在集群所有节点上,用于启动Pod的kubectl: 通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件15、通过keepalive+nginx实现k8s apiserver节点高可用1、安装nginx主备:在master1和master2上做nginx主备安装[root@master1 ~]# yum install nginx keepalived -y[root@master2 ~]# yum install nginx keepalived -y2、修改nginx配置文件。主备的配置需要保持一致 vim /etc/nginx/nginx.com 增加: #四层负载均衡,为两台Master Apiserver组件提供负载均衡stream {log_format main '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';access_log /var/log/nginx/k8s-access.lgo main;upstream k8s-apiserver {server 192.168.40.180:6443 weight=5 max_fails=3 fail_timeout=30s;server 192.168.40.181:6443 weight=5 max_fails=3 fail_timeout=30s;}server{操作如下,也可以直接备份原配置文件,然后rz上传本地写好的配置文件。[root@master1 ~]# vim /etc/nginx/nginx.confuser nginx;worker_processes auto;error_log /var/log/nginx/error.log;pid /run/nginx.pid;include /usr/share/nginx/modules/*.conf;events {worker_connections 1024;}四层负载均衡,为两台Master apiserver组件提供负载均衡stream {log_format main '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';access_log /var/log/nginx/k8s-access.log main;upstream k8s-apiserver { server 192.168.40.180:6443 weight=5 max_fails=3 fail_timeout=30s; server 192.168.40.181:6443 weight=5 max_fails=3 fail_timeout=30s;}server { listen 16443; # 由于nginx与master节点复用,这个监听端口不能是6443,否则会冲突 proxy_pass k8s-apiserver;}}http {log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log /var/log/nginx/access.log main;sendfile on;tcp_nopush on;tcp_nodelay on;keepalive_timeout 65;types_hash_max_size 2048;include /etc/nginx/mime.types;default_type application/octet-stream;server { listen 80 default_server; server_name _; location / { }}}listen 16443;#由于nginx与master节点复用,这个监听端口不能是6443,否则会有冲突proxy_pass k8s-apiserver;}}master2也采用相同操作。3)、keepalived配置 a、主keepalived[root@master1 ~]# vim /etc/keepalived/keepalived.conf global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id NGINX_MASTER} vrrp_script check_nginx { script "/etc/keepalived/check_nginx.sh"}vrrp_instance VI_1 { state MASTER interface ens33 # 修改为实际网卡名 virtual_router_id 51 # VRRP 路由 ID实例,每个实例是唯一的 priority 100 # 优先级,备服务器设置 90 advert_int 1 # 指定VRRP 心跳包通告间隔时间,默认1秒 authentication { auth_type PASS auth_pass 1111 } # 虚拟IP virtual_ipaddress { 192.168.40.199/24 } track_script { check_nginx } }#vrrp_script:指定检查nginx工作状态脚本(根据nginx状态判断是否故障转移)#virtual_ipaddress:虚拟IP(VIP)[root@master1 ~]# vim /etc/keepalived/check_nginx.sh !/bin/bash1、判断Nginx是否存活counter=$(ps -ef |grep nginx | grep sbin | egrep -cv "grep|$$" )if [ $counter -eq 0 ]; then #2、如果不存活则尝试启动Nginx service nginx start sleep 2 #3、等待2秒后再次获取一次Nginx状态 counter=$(ps -ef |grep nginx | grep sbin | egrep -cv "grep|$$" ) #4、再次进行判断,如Nginx还不存活则停止Keepalived,让地址进行漂移 if [ $counter -eq 0 ]; then service keepalived stop fifi[root@master1 ~]# chmod +x /etc/keepalived/check_nginx.shmaster2采用相同的操作,配置文件保存一致。4、启动服务:启动之前先安装nginx-stream模块[root@master1 ~]# yum install nginx-mod-stream -y[root@master1 ~]# systemctl daemon-reload启动nginx和keepalived[root@master1 ~]# systemctl start nginx keepalived&&systemctl enable nginx keepalived查看状况[root@master1 ~]# systemctl status keepalived● keepalived.service - LVS and VRRP High Availability MonitorLoaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)Active: active (running) since 六 2023-10-14 10:59:10 CST; 16s agoMain PID: 19607 (keepalived)CGroup: /system.slice/keepalived.service├─19607 /usr/sbin/keepalived -D├─19608 /usr/sbin/keepalived -D└─19609 /usr/sbin/keepalived -D5、测试vip是否绑定成功[root@master1 ~]# ip addr1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:81:87:5a brd ff:ff:ff:ff:ff:ffinet 192.168.40.180/24 brd 192.168.40.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet 192.168.40.199/24 scope global secondary ens33valid_lft forever preferred_lft foreverinet6 fe80::aaff:e4a0:d160:38d3/64 scope link noprefixroutevalid_lft forever preferred_lft forever6、测试keepalived:停掉master1上的keepalived,Vip会漂移到master2[root@master1 ~]# service keepalived stop[root@master2]# ip addr16、kubeadm初始化k8s集群a、在master1节点上创建kubeadm-config.yml文件[root@master1 ~]# cat kubeadm-config.yamlapiVersion: kubeadm.k8s.io/v1beta2kind: ClusterConfigurationkubernetesVersion: v1.20.6controlPlaneEndpoint: 192.168.40.199:16443imageRepository: registry.aliyuncs.com/google_containersapiServer:certSANs:192.168.40.180192.168.40.181192.168.40.182192.168.40.199networking:podSubnet: 10.244.0.0/16serviceSubnet: 10.96.0.0/16 apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: ipvsb、把初始化k8s集群需要的离线镜像包k8simage-1-20-6.tar.gz上传到master1、master2、node1机器上,手动解压:[root@master1 ~]# docker load -i k8simage-1-20-6.tar.gz[root@master2 ~]# docker load -i k8simage-1-20-6.tar.gz[root@node1 ~]# docker load -i k8simage-1-20-6.tar.gz初始化k8s集群命令:[root@master1]# kubeadm init --config kubeadm-config.yaml --ignore-preflight-errors=SystemVerification特别提醒:--image-repository registry.aliyuncs.com/google_containers为保证拉取镜像不到国外站点拉取,手动指定仓库地址为registry.aliyuncs.com/google_containers。kubeadm默认从k8s.gcr.io拉取镜像。 我们本地有导入到的离线镜像,所以会优先使用本地的镜像。mode: ipvs 表示kube-proxy代理模式是ipvs,如果不指定ipvs,会默认使用iptables,但是iptables效率低,所以我们生产环境建议开启ipvs,阿里云和华为云托管的K8s,也提供ipvs模式。安装成功最后有如下提示:Then you can join any number of worker nodes by running the following on each as root:kubeadm join 192.168.40.199:16443 --token qnmgnl.mk5nisfwa4lbzsc4 \--discovery-token-ca-cert-hash sha256:99902cb959dda1bb32061bedcc364233a6cc5091e0c5c0832277a44f31abc74f 配置kubectl的配置文件config,相当于对kubectl进行授权,这样kubectl命令可以使用这个证书对k8s集群进行管理[root@master1 ~]# mkdir -p $HOME/.kube[root@master1 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config[root@master1 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config查看安装状态:[root@master1 ~]# kubectl get nodesNAME STATUS ROLES AGE VERSIONmaster1 NotReady control-plane,master 5m45s v1.20.6此时集群状态还是NotReady状态,是因为还没有安装网络插件17、扩容k8s集群-添加master节点把master1节点的证书拷贝到master2上,在master2创建证书存放目录:[root@master2 ~]# cd /root/&&mkdir -p /etc/kubernetes/pki/etcd&&mkdir -p ~/.kube/返回master1节点上,把节点证书传一份给master2上。[root@master1 pki]# scp ca.crt ca.key master2:/etc/kubernetes/pki/[root@master1 pki]# scp sa.key sa.pub front-proxy-ca.crt front-proxy-ca.key master2:/etc/kubernetes/pki/[root@master1 pki]# scp ./etcd/ca.crt master2:/etc/kubernetes/pki/etcd/[root@master1 pki]# scp ./etcd/ca.key master2:/etc/kubernetes/pki/etcd/然后返回master1上获取加入集群命令 ,执行:kubeadm token create --print-join-command[root@master1 pki]# kubeadm token create --print-join-commandkubeadm join 192.168.40.199:16443 --token 5u8ixe.x8kcchoipnuoqtt6 --discovery-token-ca-cert-hash sha256:99902cb959dda1bb32061bedcc364233a6cc5091e0c5c0832277a44f31abc74f 然后在master2上执行:(管理节点 加上 --control-plane )kubeadm join 192.168.40.199:16443 --token 5u8ixe.x8kcchoipnuoqtt6 --discovery-token-ca-cert-hash sha256:99902cb959dda1bb32061bedcc364233a6cc5091e0c5c0832277a44f31abc74f --control-plane --ignore-preflight-errors=SystemVerification然后在node1上执行:kubeadm join 192.168.40.199:16443 --token 5u8ixe.x8kcchoipnuoqtt6 --discovery-token-ca-cert-hash sha256:99902cb959dda1bb32061bedcc364233a6cc5091e0c5c0832277a44f31abc74f --ignore-preflight-errors=SystemVerification返回master1查看集群状况:kubectl get nodes[root@master1 pki]# kubectl get nodesNAME STATUS ROLES AGE VERSIONmaster1 NotReady control-plane,master 96m v1.20.6master2 NotReady control-plane,master 37s v1.20.6node1 NotReady 11m v1.20.6可以看到node1的ROLES角色为空,就表示这个节点是工作节点。可以把node1的ROLES变成work,按照如下方法:[root@master1 ~]# kubectl label node node1 node-role.kubernetes.io/worker=worker[root@master1 ~]# kubectl get nodesNAME STATUS ROLES AGE VERSIONmaster1 NotReady control-plane,master 111m v1.20.6master2 NotReady control-plane,master 15m v1.20.6node1 NotReady worker 26m v1.20.6注意:上面可以看出集群主机的状态都是NotReady状态,说明没有安装网络插件[root@master1 ~]# kubectl get pods -n kube-systemNAME READY STATUS RESTARTS AGEcoredns-7f89b7bc75-dqrxj 0/1 Pending 0 112mcoredns-7f89b7bc75-qzc9p 0/1 Pending 0 112metcd-master1 1/1 Running 0 112metcd-master2 1/1 Running 0 16mkube-apiserver-master1 1/1 Running 0 112mkube-apiserver-master2 1/1 Running 0 16mkube-controller-manager-master1 1/1 Running 1 112mkube-controller-manager-master2 1/1 Running 0 16mkube-proxy-dh22b 1/1 Running 0 112mkube-proxy-mp5xm 1/1 Running 0 27mkube-proxy-rp972 1/1 Running 0 16mkube-scheduler-master1 1/1 Running 1 112mkube-scheduler-master2 1/1 Running 0 16m18、安装kubernetes网络组件-Calico上传calico.yaml到master1上,使用yaml文件安装calico 网络插件安装命令:[root@master1 ~]# kubectl apply -f calico.yaml查询运行状况:[root@master1 ~]# kubectl get pods -n kube-systemNAME READY STATUS RESTARTS AGEcalico-kube-controllers-6949477b58-nzh84 1/1 Running 0 70scalico-node-cggnz 1/1 Running 0 70scalico-node-fm7rv 1/1 Running 0 70scalico-node-k28fk 1/1 Running 0 70scoredns-7f89b7bc75-dqrxj 1/1 Running 0 117mcoredns-7f89b7bc75-qzc9p 1/1 Running 0 117metcd-master1 1/1 Running 0 117metcd-master2 1/1 Running 0 21mkube-apiserver-master1 1/1 Running 0 117mkube-apiserver-master2 1/1 Running 0 21mkube-controller-manager-master1 1/1 Running 1 117mkube-controller-manager-master2 1/1 Running 0 21mkube-proxy-dh22b 1/1 Running 0 117mkube-proxy-mp5xm 1/1 Running 0 32mkube-proxy-rp972 1/1 Running 0 21mkube-scheduler-master1 1/1 Running 1 117mkube-scheduler-master2 1/1 Running 0 21m查看集群运行状况[root@master1 ~]# kubectl get nodesNAME STATUS ROLES AGE VERSIONmaster1 Ready control-plane,master 118m v1.20.6master2 Ready control-plane,master 21m v1.20.6node1 Ready worker 32m v1.20.619、测试在k8s创建pod是否可以正常访问网络把busybox-1-28.tar.gz上传到node1节点,手动解压[root@node1 ~]# docker load -i busybox-1-28.tar.gz在master1节点上执行:kubectl run busybox --image busybox:1.28 --restart=Never --rm -it busybox -- sh进入容器测试网络:/ # ping www.baidu.comPING www.baidu.com (39.156.66.18): 56 data bytes64 bytes from 39.156.66.18: seq=0 ttl=127 time=39.3 ms通过上面可以看到能访问网络,说明calico网络插件已经被正常安装了20 、测试coredns是否正常[root@master1 ~]# kubectl run busybox --image busybox:1.28 --restart=Never --rm -it busybox -- shIf you don't see a command prompt, try pressing enter./ # nslookup kubernetes.default.svc.cluster.localServer: 10.96.0.10Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.localName: kubernetes.default.svc.cluster.localAddress 1: 10.96.0.1 kubernetes.default.svc.cluster.local/ # 21、延长k8s证书查看证书有效时间:openssl x509 -in /etc/kubernetes/pki/ca.crt -noout -text |grep Not显示如下,通过下面可看到ca证书有效期是10年[root@master1 ~]# openssl x509 -in /etc/kubernetes/pki/ca.crt -noout -text |grep NotNot Before: Oct 14 04:45:12 2023 GMTNot After : Oct 11 04:45:12 2033 GMTopenssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep Not显示如下,通过下面可看到apiserver证书有效期是1年[root@master1 ~]# openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep NotNot Before: Oct 14 04:45:12 2023 GMTNot After : Oct 13 04:45:12 2024 GMT 把资料包里的update-kubeadm-cert.sh文件上传到master1和master2节点,分别执行如下操作:1)给update-kubeadm-cert.sh证书授权可执行权限[root@master1~]#chmod +x update-kubeadm-cert.sh2)执行下面命令,修改证书过期时间,把时间延长到10年[root@master1 ~]# ./update-kubeadm-cert.sh all3)给update-kubeadm-cert.sh证书授权可执行权限[root@master2~]#chmod +x update-kubeadm-cert.sh4)执行下面命令,修改证书过期时间,把时间延长到10年[root@master2 ~]# ./update-kubeadm-cert.sh all3)在master1节点查询Pod是否正常,能查询出数据说明证书签发完成kubectl get pods -n kube-system显示如下,能够看到pod信息,说明证书签发正常:
2023年-10月-27日
343 阅读
0 评论
技术
2
3
4
5