首页 文章 精选 留言 我的

精选列表

搜索[k8s],共4073篇文章
优秀的个人博客,低调大师

K8S有状态服务-StatefulSet使用最佳实践

介绍 StatefulSet是一种给Pod提供唯一标志的控制器,它可以保证部署和扩展的顺序。 Pod一致性:包含次序(启动、停止次序)、网络一致性。此一致性与Pod相关,与被调度到哪个node节点无关。 稳定的次序:对于N个副本的StatefulSet,每个Pod都在[0,N)的范围内分配一个数字序号,且是唯一的。 稳定的网络:Pod的hostname模式为$(statefulset名称)-$(序号)。 稳定的存储:通过VolumeClaimTemplate为每个Pod创建一个PV。删除、减少副本,不会删除相关的卷。 阿里云云盘支持动态挂载的功能,可以通过VolumeClaimTemplate方式部署statefulset应用。 部署Statefulset服务 volumeClaimTemplates:表示一类PVC的模板,系统会根据Statef

优秀的个人博客,低调大师

Kubernetes(K8S)集群管理Docker容器(部署篇)

一、架构拓扑图 二、环境规划 角色 IP 组件 master 192.168.0.211 etcd kube-apiserver kube-controller-manager kube-scheduler node01 192.168.0.212 kubelet kube-proxy docker node02 192.168.0.213 kubelet kube-proxy docker 环境说明: 操作系统:Ubuntu16.04 or CentOS7 Kubernetes版本:v1.8.3 Docker版本:v17.09-ce 均采用当前最新稳定版本。 关闭selinux。 三、部署集群 3.1下载二进制包 打开下面网址,下载下面两个红色框框的包。 https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.8.md#v183 下载完成后,上传到服务器: kubernetes-server-linux-amd64.tar.gz上传到master节点。 kubernetes-node-linux-amd64.tar.gz 上传到node节点。 3.2 安装etcd3 1 2 3 4 5 6 7 8 k8s-master #yuminstalletcd–y k8s-master #vi/etc/etcd/etcd.conf ETCD_NAME= "default" ETCD_DATA_DIR= "/var/lib/etcd/default" ETCD_LISTEN_CLIENT_URLS= "http://0.0.0.0:2379" ETCD_ADVERTISE_CLIENT_URLS=http: //0 .0.0.0:2379 k8s-master #systemctlenableetcd k8s-master #systemctlstartetcd 注意:Ubuntu系统etcd配置文件在/etc/default/etcd。 3.3运行Master节点组件 1 2 3 k8s-master #tarzxvfkubernetes-server-linux-amd64.tar.gz k8s-master #mkdir-p/opt/kubernetes/{bin,cfg} k8s-master #mvkubernetes/server/bin/{kube-apiserver,kube-scheduler,kube-controller-manager,kubectl}/opt/kubernetes/bin 3.3.1 apiserver 创建配置文件: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #vi/opt/kubernetes/cfg/kube-apiserver #启用日志标准错误 KUBE_LOGTOSTDERR= "--logtostderr=true" #日志级别 KUBE_LOG_LEVEL= "--v=4" #Etcd服务地址 KUBE_ETCD_SERVERS= "--etcd-servers=http://192.168.0.211:2379" #API服务监听地址 KUBE_API_ADDRESS= "--insecure-bind-address=0.0.0.0" #API服务监听端口 KUBE_API_PORT= "--insecure-port=8080" #对集群中成员提供API服务地址 KUBE_ADVERTISE_ADDR= "--advertise-address=192.168.0.211" #允许容器请求特权模式,默认false KUBE_ALLOW_PRIV= "--allow-privileged=false" #集群分配的IP范围 KUBE_SERVICE_ADDRESSES= "--service-cluster-ip-range=10.10.10.0/24" 创建systemd服务文件: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #vi/lib/systemd/system/kube-apiserver.service [Unit] Description=KubernetesAPIServer Documentation=https: //github .com /kubernetes/kubernetes [Service] EnvironmentFile=- /opt/kubernetes/cfg/kube-apiserver #ExecStart=/opt/kubernetes/bin/kube-apiserver${KUBE_APISERVER_OPTS} ExecStart= /opt/kubernetes/bin/kube-apiserver \ ${KUBE_LOGTOSTDERR}\ ${KUBE_LOG_LEVEL}\ ${KUBE_ETCD_SERVERS}\ ${KUBE_API_ADDRESS}\ ${KUBE_API_PORT}\ ${KUBE_ADVERTISE_ADDR}\ ${KUBE_ALLOW_PRIV}\ ${KUBE_SERVICE_ADDRESSES} Restart=on-failure [Install] WantedBy=multi-user.target 启动服务,并设置开机启动: 1 2 3 #systemctldaemon-reload #systemctlenablekube-apiserver #systemctlrestartkube-apiserver 注意:apiserver默认支持etcd3,如果是etcd2,需启动时指定版本选项--storage-backend=etcd2 3.3.2 scheduler 创建配置文件: 1 2 3 4 5 #vi/opt/kubernetes/cfg/kube-scheduler KUBE_LOGTOSTDERR= "--logtostderr=true" KUBE_LOG_LEVEL= "--v=4" KUBE_MASTER= "--master=192.168.0.211:8080" KUBE_LEADER_ELECT= "--leader-elect" 创建systemd服务文件: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #vi/lib/systemd/system/kube-scheduler.service [Unit] Description=KubernetesScheduler Documentation=https: //github .com /kubernetes/kubernetes [Service] EnvironmentFile=- /opt/kubernetes/cfg/kube-scheduler ExecStart= /opt/kubernetes/bin/kube-scheduler \ ${KUBE_LOGTOSTDERR}\ ${KUBE_LOG_LEVEL}\ ${KUBE_MASTER}\ ${KUBE_LEADER_ELECT} Restart=on-failure [Install] WantedBy=multi-user.target 启动服务,并设置开机启动: 1 2 3 #systemctldaemon-reload #systemctlenablekube-scheduler #systemctlrestartkube-scheduler 3.3.3 controller-manager 创建配置文件: 1 2 3 4 #vi/opt/kubernetes/cfg/kube-controller-manager KUBE_LOGTOSTDERR= "--logtostderr=true" KUBE_LOG_LEVEL= "--v=4" KUBE_MASTER= "--master=192.168.0.211:8080" 创建systemd服务文件: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #vi/lib/systemd/system/kube-controller-manager.service [Unit] Description=KubernetesControllerManager Documentation=https: //github .com /kubernetes/kubernetes [Service] EnvironmentFile=- /opt/kubernetes/cfg/kube-controller-manager ExecStart= /opt/kubernetes/bin/kube-controller-manager \ ${KUBE_LOGTOSTDERR}\ ${KUBE_LOG_LEVEL}\ ${KUBE_MASTER}\ ${KUBE_LEADER_ELECT} Restart=on-failure [Install] WantedBy=multi-user.target 启动服务,并设置开机启动: 1 2 3 #systemctldaemon-reload #systemctlenablekube-controller-manager #systemctlrestartkube-controller-manager 3.3.4小结 Master节点组件就全部启动了,需要注意的是服务启动顺序有依赖,先启动etcd,再启动apiserver,其他组件无顺序要求。 查看Master节点组件进程状态: 说明组件都在运行。 如果启动失败,请查看启动日志,例如: #journalctl -u kube-apiserver 3.4 运行Node节点组件 1 2 3 k8s-node01 #tarzxvfkubernetes-node-linux-amd64.tar.gz k8s-node01 #mkdir-p/opt/kubernetes/{bin,cfg} k8s-node01 #mvkubernetes/node/bin/{kubelet,kube-proxy}/opt/kubernetes/bin/ 3.4.1 kubelet 创建kubeconfig配置文件: 1 2 3 4 5 6 7 8 9 10 11 12 #vi/opt/kubernetes/cfg/kubelet.kubeconfig apiVersion:v1 kind:Config clusters: -cluster: server:http: //192 .168.0.211:8080 name: local contexts: -context: cluster: local name: local current-context: local kubeconfig文件用于kubelet连接master apiserver。 创建配置文件: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #vi/opt/kubernetes/cfg/kubelet #启用日志标准错误 KUBE_LOGTOSTDERR= "--logtostderr=true" #日志级别 KUBE_LOG_LEVEL= "--v=4" #Kubelet服务IP地址 NODE_ADDRESS= "--address=192.168.0.212" #Kubelet服务端口 NODE_PORT= "--port=10250" #自定义节点名称 NODE_HOSTNAME= "--hostname-override=192.168.0.212" #kubeconfig路径,指定连接API服务器 KUBELET_KUBECONFIG= "--kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig" #允许容器请求特权模式,默认false KUBE_ALLOW_PRIV= "--allow-privileged=false" #DNS信息 KUBELET_DNS_IP= "--cluster-dns=10.10.10.2" KUBELET_DNS_DOMAIN= "--cluster-domain=cluster.local" #禁用使用Swap KUBELET_SWAP= "--fail-swap-on=false" 创建systemd服务文件: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #vi/lib/systemd/system/kubelet.service [Unit] Description=KubernetesKubelet After=docker.service Requires=docker.service [Service] EnvironmentFile=- /opt/kubernetes/cfg/kubelet ExecStart= /opt/kubernetes/bin/kubelet \ ${KUBE_LOGTOSTDERR}\ ${KUBE_LOG_LEVEL}\ ${NODE_ADDRESS}\ ${NODE_PORT}\ ${NODE_HOSTNAME}\ ${KUBELET_KUBECONFIG}\ ${KUBE_ALLOW_PRIV}\ ${KUBELET_DNS_IP}\ ${KUBELET_DNS_DOMAIN}\ ${KUBELET_SWAP} Restart=on-failure KillMode=process [Install] WantedBy=multi-user.target 启动服务,并设置开机启动: 1 2 3 #systemctldaemon-reload #systemctlenablekubelet #systemctlrestartkubelet 3.4.2 proxy 创建配置文件: 1 2 3 4 5 6 7 8 9 #vi/opt/kubernetes/cfg/kube-proxy #启用日志标准错误 KUBE_LOGTOSTDERR= "--logtostderr=true" #日志级别 KUBE_LOG_LEVEL= "--v=4" #自定义节点名称 NODE_HOSTNAME= "--hostname-override=192.168.0.212" #API服务地址 KUBE_MASTER= "--master=http://192.168.0.211:8080" 创建systemd服务文件: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #vi/lib/systemd/system/kube-proxy.service [Unit] Description=KubernetesProxy After=network.target [Service] EnvironmentFile=- /opt/kubernetes/cfg/kube-proxy ExecStart= /opt/kubernetes/bin/kube-proxy \ ${KUBE_LOGTOSTDERR}\ ${KUBE_LOG_LEVEL}\ ${NODE_HOSTNAME}\ ${KUBE_MASTER} Restart=on-failure [Install] WantedBy=multi-user.target 启动服务,并设置开机启动: 1 2 3 #systemctldaemon-reload #systemctlenablekube-proxy #systemctlrestartkube-proxy 3.4.3小结 其他节点加入集群与node01方式相同,但需修改kubelet的--address和--hostname-override选项为本机IP。 查看Node节点组件进程状态: 说明组件都在运行。 如果启动失败,请查看启动日志,例如: #journalctl -u kubelet 3.5 验证集群是否部署成功 设置可执行文件到系统变量,方便使用: 1 2 #echo"exportPATH=$PATH:/opt/kubernetes/bin">>/etc/profile #source/etc/profile 查看集群节点状态: 两个节点都加入到了kubernetes集群,就此部署完成。 本文转自 李振良OK 51CTO博客,原文链接:http://blog.51cto.com/lizhenliang/1983392,如需转载请自行联系原作者

优秀的个人博客,低调大师

K8s Ingress Controller

NGINX 向云原生演进,All inOpenNJet概述 OpenNJet KIC(K ubernetes Ingress Controller)基于OpenNJet proxy的动态特性、高性能实现。弥补nginx 在云原生场景中应用的不足。提供了丰富的流量管理能力,如动态location、host/path路由、负载均衡、动态upstream、金丝雀发布、TLS Termination/SNI等。 本版本主要特性: 支持Ingress API、支持path/host路由 支持自定义资源VirtualServer,支持path/host、高级(header、请求方法等)路由 支持动态Upstream 支持Upstream 负载均衡, 支持round-robin 及 consitent hash 算法 支持Upstream 主动健康检查 支持 TLS SNI 支持Prometheus 指标采集 架构图如下: 新特性概览 Ingress API OpenNJet KIC采用动态API方式实现基本路由/TLS的变化的更改,当Ingress资源变化时,而不需要reload OpenNJet 配置文件。我们采用单server多location的方式实现HTTP host头匹配,和path匹配。如下图所示: 当Ingress资源中host或者path变化时,通过动态location API来更新OpenNJet的配置信息,而不是reload OpenNJet配置文件。 当Ingress资源中关联的service发生改变或者service关联的pod进行了动态扩缩容时,我们通过动态Upstream API(目前基于lua实现)来更新OpenNJet的配置信息,而不是reload OpenNJet配置文件。资源变更应用如下表所述: 资源变化 OpenNJet配置信息变化方式 Ingress资源变化 删除新建 Ingress 动态location API 动态Upstream API 内容 host 动态location API path 动态location API service 动态Upstream API pod动态扩缩容 endpoint 动态Upstream API VirtualServer CR API VirtualServer是一个自定义资源,在OpenNJet KIC中用来替代Ingress资源,是一个替代方案。VirtualServer除了具备Ingress的能力,还提供了更丰富的功能,比如 advanced content-based routing等,可以灵活的配置匹配策略实现灰度发布。 VS在处理一个路由时,高级路由匹配由spec中的matches定义。conditions在匹配中定义条件,支持 header、 cookie、 argument、 variable。 以下是一个VS的示例: apiVersion: k8s.njet.org/v1 kind: VirtualServer metadata: name: cafe namespace: default spec: host: cafe.example.com.vs routes: - action: pass: details matches: - action: pass: tea-post conditions: - value: POST variable: $request_method path: ~* \.html$ - action: pass: ratings matches: - action: pass: productpage conditions: - cookie: version value: v2 - value: GET variable: $request_method path: /productpage upstreams: - name: ratings port: 9080 service: ratings - name: productpage port: 9080 service: productpage - name: tea-post port: 80 service: tea-post-svc - name: details port: 9080 service: details 上图VS中,配置了两个路由: path为\.html$ 的正则匹配,匹配以.html结尾的请求,实现高级路由(请求方法为POST的请求被路由到 tea-post upstream,其他请求被路由到 details upstream(默认处理)) path为/productpage的前缀匹配,实现高级路由(请求方法为GET且cookie 为version=v2的请求被路由到 productpage upstream,其他请求被路由到 ratings upstream(默认处理)) 实现方式与Ingress基本一致。 动态Upstream 在Upstream配置更新方面,OpenNJet KIC使用lua实现Upstream动态配置,来应对云原生场景。在云原生场景中,upstrem变更是常态,比如集群部署了新的服务、某服务进行了动态扩缩容、Pod被重新调度等,这都导致upstream相关配置的变更。 OpenNJet KIC配置当中会生成一个默认的被称为"upstream_balancer"的upstream,此upstream会处理所有路由。当真实流量到来时,会交由内部lua上下文处理。"upstream_balancer"配置如下: upstream upstream_balancer { ### Attention!!! # # We no longer create "upstream" section for every backend. # Backends are handled dynamically using Lua. # ### server 0.0.0.1; # placeholder balancer_by_lua_block { balancer.balance() } keepalive 320; keepalive_time 1h; keepalive_timeout 120s; keepalive_requests 10000; } lua上下文怎么区分不同流量该由谁处理呢? 首先,OpenNJet KIC会通过动态upstream API接口创建所有upstream信息。 其次,每个路由(location)都会关联实际处理自己的upstream名称。 最后,实际处理流量的upstream名称会被传递到lua上下文,最终保证流量被正确处理。 路由与upstream关联如下所示: Upstream的更新流程 Upstream 负载均衡 Upstream 可以设置对应的负载均衡策略,目前支持默认的 round_robin,及一致性hash。round_robin 使用轮询的方式获取peer。一致性 hash 根据配置的hash key 值来进行负载,相同的key值,将始终访问同一个后端peer。常用的hash key有: hash key 描述 $arg_{VAR} 根据url 传递的参数 VAR 做一致性hash $http_{NAME} 根据HEADER 传递的参数 NAME 做一致性hash $cookie_{NAME} 根据 Cookie 传递的参数 NAME 做一致性hash $remote_addr 根据客户端的IP做一致性hash OpenNJet 可使用的内部变量与 Nginx 一致,可以参考文档:https://nginx.org/en/docs/varindex.html Ingress与VirtualServer CR都支持Upstream 负载均衡策略配置。 下面给出一个VS配置Upstream 负载均衡的一个例子: 上面的例子通过lb-method: "chash $arg_uu" 进行显式的声明Upstream 负载均衡算法为chash且以请求携带的参数uu为hash key。 Upstream 主动健康检查 OpenNJet KIC提供了Upstream 主动健康检查的能力,确保所有请求都能被健康的上游后端处理,提高用户体验度。 通过Ingress、VirtualServer CR配置Upstream 的主动健康检查, OpenNJet KIC 会通过单独的一个 priviliege agent 进程对upstream 的各peer进行检查, 如果 peer 检查失败,并且失败次数达到预先配置的阈值,健康检查程序会将对应的peer 从 upstream peer 列表中移除。被移除的peer, 在之后的检查中如果为健康状态,并达到配置的阈值,将会触发重新上线的操作。 下图为健康检查架构图: 更新 Upstream 数据时,生成一份 "raw hc backends" 的副本, 定时器中的健康检查使用此副本中的数据进行。 当健康检查结果需要触发peers 变更时,更新共享内存中的 upstream backends。 目前健康检查模块的定时器时间间隔是 5秒。策略中的健康检查间隔需>=5s 。 下面给出一个VS配置主动健康检查的一个例子: TLS Termination/SNI OpenNJet KIC处理TLS流量由内部端口443负责,支持TLS Termination/SNI功能,根据主机名在同一端口上进行多路复用。 Ingress、VirtualServer CR都支持 TLS Termination/SNI配置,且OpenNJet KIC支持配置动态更新,不进行reload,这一能力得益于OpenNJet提供的动态map能力。host与证书的对应关系通过动态map HTTP 接口进行更新。 下面给出一个VS配置TLS的一个例子: 上面的例子配置期望把 vstest.example.com与 a.test.com对应的证书进行关联。 Prometheus 指标采集 为了满足用户对业务的监控,OpenNJet KIC目前提供了VTS(virtual host traffic status)指标采集,OpenNJet使用定制的 vts 模块,采集upstream的相关指标。 OpenNJet KIC容器中的OpenNJet 进程通过vts 模块记录Upstream 的相关指标信息,并且OpenNJet 提供HTTP 接口获取Prometheus 格式的指标信息。 KIC 服务中通过注解Annotations 声明Prometheus 指标的采集端口及路径。配置如下: apiVersion: v1 kind: Service metadata: annotations: prometheus.io/port: "12001" prometheus.io/scheme: http prometheus.io/scrape: "true" prometheus.io/path: "/stats" name: njet-ingress namespace: njet-ingress spec: type: NodePort ports: - port: 80 targetPort: 80 protocol: TCP name: http - port: 443 targetPort: 443 protocol: TCP name: https selector: app: njet-ingress 参考链接 OpenNJet 最早是基于 NGINX1.19 基础 fork 并独立演进,具有高性能、稳定、易扩展的特点,同时也解决了 NGINX 长期存在的难于动态配置、管理功能影响业务等问题。 KIC用户手册 官网

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册