首页
关于
留言
接口
搜索
资讯
技术
资源
悦读
杂记
首页
登录
登录
搜索
emer
累计撰写
60
篇文章
累计收到
0
条评论
首页
栏目
资讯
技术
资源
悦读
杂记
首页
登录
页面
首页
关于
留言
接口
作者 【1】 的文章
置顶
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日
469 阅读
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日
290 阅读
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日
740 阅读
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日
673 阅读
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日
319 阅读
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日
264 阅读
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日
407 阅读
0 评论
技术
2023-10-27
K8s单节点高可用集群安装记录(1-20-6 docker版)
1、通过centos模板机创建三台主机,修改主机名,设置网络静态地址如下:主机1:hmaster1 IP 192.168.40.180主机2:hnode1 IP 192.168.40.181主机3:hnode2 IP 192.168.40.1822、检查SELINUX是否关闭,执行getenforce打开修改 vim /etc/selinux/config编辑 SELINUX=disabled保存退出,重启服务器才可生效。其他命令: sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config #修改selinux配置文件之后,重启机器,selinux配置才能永久生效3、配置主机hosts文件,相互之间通过主机名互相访问,修改每台机器的/etc/hosts文件,增加如下三行:192.168.40.180 hmaster1192.168.40.181 hnode1192.168.40.182 hnode2[root@hmaster1 ~]# vim /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4::1 localhost localhost.localdomain localhost6 localhost6.localdomain6192.168.40.180 hmaster1192.168.40.181 hnode1192.168.40.182 hnode24、配置主机之间无密码登录命令在三主机分别执行:ssh-keygen -t rsa #生成登陆秘钥ssh-copy-id hmaster1ssh-copy-id hnode1ssh-copy-id hnode25、关闭交换分区swap,提升性能临时关闭 root@hmaster1 ~]# swapoff -a#永久关闭:注释掉/etc/fstab里的swap挂载,给swap这行开头加一下注释问题1:为什么要关闭swap交换分区?Swap是交换分区,如果机器内存不够,会使用swap分区,但是swap分区的性能较低,k8s设计的时候为了能提升性能,默认是不允许使用交换分区的。Kubeadm初始化的时候会检测swap是否关闭,如果没关闭,那就初始化失败。如果不想要关闭交换分区,安装k8s的时候可以指定--ignore-preflight-errors=Swap来解决。6、修改机器内核参数,设置IP转发[root@hmaster1 ~]# modprobe br_netfilter[root@hmaster1 ~]# echo "modprobe br_netfilter" >> /etc/profile[root@hmaster1 ~]# cat > /etc/sysctl.d/k8s.conf <<EOFnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1net.ipv4.ip_forward = 1EOF[root@hmaster1 ~]# sysctl -p /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1net.ipv4.ip_forward = 1hnode1和hnode2采用相同操作。7、关闭firewalld防火墙,并设置随机不启动命令1:systemctl stop firewalld ; systemctl disable firewalld也可以执行命令2:systemctl disable firewalld --now如下:[root@hmaster1 ~]# ps -ef|grep firewallroot 753 1 0 12:18 ? 00:00:00 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopidroot 18709 18598 0 18:12 pts/0 00:00:00 grep --color=auto firewall[root@hmaster1 ~]# systemctl disable firewalld --nowRemoved symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.[root@hmaster1 ~]# ps -ef|grep firewallroot 18768 18598 0 18:12 pts/0 00:00:00 grep --color=auto firewall8、配置阿里云的repo源命令: yum install -y yum-utilsyum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo9、安装基础依赖包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 ipvsadm10、 配置安装k8s组件需要的阿里云的repo源[root@hmaster1 ~]#vim /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/enabled=1gpgcheck=0将新创建好的repo源文件复制到其他节点相应的目录下。[root@hmaster1 ~]# scp /etc/yum.repos.d/kubernetes.repo hnode1:/etc/yum.repos.d/kubernetes.repo 100% 128 160.2KB/s 00:00 [root@hmaster1 ~]# scp /etc/yum.repos.d/kubernetes.repo hnode2:/etc/yum.repos.d/kubernetes.repo 100% 128 167.7KB/s 00:00 11、配置时间同步 ntpdate chrony安装ntpdate命令 [root@hmaster1 ~]# yum install ntpdate -y #跟网络时间做同步 [root@hmaster1 ~]# ntpdate cn.pool.ntp.org #把时间同步做成计划任务 [root@hmaster1 ~]# crontab -e * */1 * * * /usr/sbin/ntpdate cn.pool.ntp.org wq保存退出,重启计划任务二、安装docker服务1、安装 docker-ce多主机同步执行:yum install -y docker-ce-20.10.62、启动docker:systemctl enable docker --now查看docker运行状况systemctl status docker3、配置docker镜像加速器和驱动vim /etc/docker/daemon.json{"registry-mirrors":["https://rsbud4vc.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com"],"exec-opts": ["native.cgroupdriver=systemd"]} 修改docker文件驱动为systemd,默认为cgroupfs,kubelet默认使用systemd,两者必须一致才可以。systemctl daemon-reload #加载镜像加速器配置文件systemctl restart docker #重启dockersystemctl status docker #检查docker是否正常,如果不能正常启动,检查配置文件4、安装初始化k8s需要的软件包yum install -y kubelet-1.20.6 kubeadm-1.20.6 kubectl-1.20.6systemctl enable kubelet #设置kubelet随机启动,不然会导致pod无法启动。注:每个软件包的作用Kubeadm: kubeadm是一个工具,用来初始化k8s集群的kubelet: 安装在集群所有节点上,用于启动Pod的kubectl: 通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件5、kubeadm初始化k8s集群将镜像包k8simage-1-20-6.tar.gz上传到三台服务器上,手动解压:docker load -i k8simage-1-20-6.tar.gz三个机器都需要解压6、使用kubeadm初始化k8s集群[root@hmaster1~]# kubeadm config print init-defaults > kubeadm.yaml #获取初始化模板文件kubeadm.yaml的修改配置如下:[root@hmaster1 ~]# cat kubeadm.yamlapiVersion: kubeadm.k8s.io/v1beta2bootstrapTokens:groups:system:bootstrappers:kubeadm:default-node-tokentoken: abcdef.0123456789abcdefttl: 24h0m0susages:signingauthenticationkind: InitConfigurationlocalAPIEndpoint:advertiseAddress: 192.168.40.180bindPort: 6443nodeRegistration:criSocket: /var/run/dockershim.sockname: hmaster1taints:effect: NoSchedulekey: node-role.kubernetes.io/masterapiServer:timeoutForControlPlane: 4m0sapiVersion: kubeadm.k8s.io/v1beta2certificatesDir: /etc/kubernetes/pkiclusterName: kubernetescontrollerManager: {}dns:type: CoreDNSetcd:local:dataDir: /var/lib/etcdimageRepository: registry.aliyuncs.com/google_containerskind: ClusterConfigurationkubernetesVersion: v1.20.6networking:dnsDomain: cluster.localserviceSubnet: 10.96.0.0/12podSubnet: 10.244.0.0/16 #指定pod网段, 需要新增加这个scheduler: {}追加如下几行apiVersion: kubeproxy.config.k8s.io/v1alpha1kind: KubeProxyConfigurationmode: ipvsapiVersion: kubelet.config.k8s.io/v1beta1kind: KubeletConfigurationcgroupDriver: systemdkubeadm.yaml修改后执行以下命令初始化kubernetes集群kubeadm init --config=kubeadm.yaml --ignore-preflight-errors=SystemVerification初始化成功后会有 kubeadm join ****类似字样,如本次实验的结果如下:********Then you can join any number of worker nodes by running the following on each as root:kubeadm join 192.168.40.180:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:7d94828271cba0b82e91497c7780d0079241c29937e2abd4d814579cb3317de0 扩展:kubeadm init初始化流程分析1) 检查执行 init 命令的用户是否为 root,如果不是 root,直接快速失败(fail fast);2) 检查待安装的 k8s 版本是否被当前版本的 kubeadm 支持(kubeadm 版本 >= 待安装 k8s 版本);3) 检查防火墙,如果防火墙未关闭,提示开放端口 10250;4) 检查端口是否已被占用,6443(或你指定的监听端口)、10257、10259;5) 检查文件是否已经存在,/etc/kubernetes/manifests/*.yaml;6) 检查是否存在代理,连接本机网络、服务网络、Pod网络,都会检查,目前不允许代理;7) 检查容器运行时,使用 CRI 还是 Docker,如果是 Docker,进一步检查 Docker 服务是否已启动,是否设置了开机自启动;8) 对于 Linux 系统,会额外检查以下内容:8.1) 检查以下命令是否存在:crictl、ip、iptables、mount、nsenter、ebtables、ethtool、socat、tc、touch;8.2) 检查 /proc/sys/net/bridge/bridge-nf-call-iptables、/proc/sys/net/ipv4/ip-forward 内容是否为 1;8.3) 检查 swap 是否是关闭状态;9) 检查内核是否被支持,Docker 版本及后端存储 GraphDriver 是否被支持;对于 Linux 系统,还需检查 OS 版本和 cgroup 支持程度(支持哪些资源的隔离);10) 检查主机名访问可达性;11) 检查 kubelet 版本,要高于 kubeadm 需要的最低版本,同时不高于待安装的 k8s 版本;12) 检查 kubelet 服务是否开机自启动;13) 检查 10250 端口是否被占用;14) 如果开启 IPVS 功能,检查系统内核是否加载了 ipvs 模块;15) 对于 etcd,如果使用 Local etcd,则检查 2379 端口是否被占用, /var/lib/etcd/ 是否为空目录;如果使用 External etcd,则检查证书文件是否存在(CA、key、cert),验证 etcd 服务版本是否符合要求;16) 如果使用 IPv6,检查 /proc/sys/net/bridge/bridge-nf-call-iptables、/proc/sys/net/ipv6/conf/default/forwarding 内容是否为 1;以上就是 kubeadm init 需要检查的所有项目了!完成安装前的配置1) 在 kube-system 命名空间创建 ConfigMap kubeadm-config,同时对其配置 RBAC 权限;2) 在 kube-system 命名空间创建 ConfigMap kubelet-config-,同时对其配置 RBAC 权限;3) 为当前节点(Master)打标记:node-role.kubernetes.io/master=;4) 为当前节点(Master)补充 Annotation;5) 如果启用了 DynamicKubeletConfig 特性,设置本节点 kubelet 的配置数据源为 ConfigMap 形式;6) 创建 BootStrap token Secret,并对其配置 RBAC 权限;7) 在 kube-public 命名空间创建 ConfigMap cluster-info,同时对其配置 RBAC 权限;8) 与 apiserver 通信,部署 DNS 服务;9) 与 apiserver 通信,部署 kube-proxy 服务;10) 如果启用了 self-hosted 特性,将 Control Plane 转为 DaemonSet 形式运行;11) 打印 join 语句; #配置kubectl的配置文件config,相当于对kubectl进行授权,这样kubectl命令可以使用这个证书对k8s集群进行管理 [root@hmaster1 ~]# mkdir -p $HOME/.kube [root@hmaster1 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [root@hmaster1 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config [root@hmaster1 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION hmaster1 NotReady control-plane,master 18m v1.20.6在hnode1、hnode2工作节点上执行以下命令,加入集群(获取的token一般24小时内有效)kubeadm join 192.168.40.180:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:7d94828271cba0b82e91497c7780d0079241c29937e2abd4d814579cb3317de0 --ignore-preflight-errors=SystemVerification返回hmaster1节点查看[root@hmaster1 ~]# kubectl get nodesNAME STATUS ROLES AGE VERSIONhmaster1 NotReady control-plane,master 26m v1.20.6hnode1 NotReady <none> 4m49s v1.20.6hnode2 NotReady <none> 10s v1.20.6给工作节点打标签可执行以下命令:kubectl label node hnode2 node-role.kubernetes.io/worker=worker [root@hmaster1 ~]# kubectl label node hnode2 node-role.kubernetes.io/worker=worker node/hnode2 labeled [root@hmaster1 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION hmaster1 NotReady control-plane,master 37m v1.20.6 hnode1 NotReady <none> 15m v1.20.6 hnode2 NotReady worker 10m v1.20.6 [root@hmaster1 ~]# kubectl label node hnode1 node-role.kubernetes.io/worker=worker node/hnode1 labeled [root@hmaster1 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION hmaster1 NotReady control-plane,master 37m v1.20.6 hnode1 NotReady worker 16m v1.20.6 hnode2 NotReady worker 11m v1.20.6 集群状态还是NotReady状态,因为没有安装网络插件
2023年-10月-27日
361 阅读
0 评论
技术
2023-10-27
k8s核心资源Pod介绍——Pod是什么?
在K8s中,pod是K8s体系中最小调度单元,我们通过定义一个Pod的资源,然后在Pod里面运行容器,容器需要指定一个镜像,这样就可以用来运行具体的服务。Pod(就像在鲸鱼荚或者豌豆荚中)是一组(一个或多个) 容器; 这些容器共享存储、网络、以及怎样运行这些容器的声明。 Pod 中的内容总是并置(colocated)的并且一同调度,在共享的上下文中运行。 Pod 所建模的是特定于应用的 “逻辑主机”,其中包含一个或多个应用容器, 这些容器相对紧密地耦合在一起。 在非云环境中,在相同的物理机或虚拟机上运行的应用类似于在同一逻辑主机上运行的云应用。如果我们把pod看成是一个“豌豆荚”,豆子看作容器(dokcer/container),里面可有一个豆子,也可能很多“豆子”(容器)。豆子多少取决于资源的分配,在K8s中我们可以过过pod的yaml文件来安排。一个Pod封装一个容器(也可以封装多个容器),Pod里的容器共享存储、网络等。也就是说,应该把整个pod看作虚拟机,然后每个容器相当于运行在虚拟机的进程。关于Pod的,K8s的官方描述文档:https://kubernetes.io/docs/concepts/workloads/pods/pod的作用:1、Pod是由一组紧耦合的容器组成的容器组,当然目前最流行的就是Docker、containerd、podman容器,Pod就可以作为1或者多个容器的载体。2、Pod中的所用容器会被一致调度、同节点部署,并且在一个“共享环境”中运行。Pod想成一个车:车里面好多座位,每个座位都坐不同的人,每个座位想成是一个容器,这里的“共享环境”包括以下几点:1)所有容器共享一个IP地址和端口空间,意味着容器之间可以通过localhost高效访问,不能有端口冲突2)允许容器之间共享存储卷,通过文件系统交互信息3、有些容器需要紧密联系,需要一起工作。Pod提供了比容器更高层次的抽象, Pod中的所有容器使用同一个网络的namespace,即相同的IP地址和Port空间。它们可以直接用localhost通信。同样的,这些容器可以共享存储,当K8s挂载Volume到Pod上,本质上是将volume挂载到Pod中的每一个容器里。
2023年-10月-27日
246 阅读
0 评论
技术
2023-10-25
K8s手动强制删除处于terminating状态的Pod命令
root用户下执行:kubectl delete pod xxx --force --grace-period=0重启kubelet服务—实在不行直接干掉整个命名空间
2023年-10月-25日
284 阅读
0 评论
杂记
2
3
4
5