Kubernetes

Kube-OVN网络VM无法访问外网问题

现象 Kubernetes集群新添加了一批物理机,成功添加集群后发现新建的虚拟机在新节点上无法访问Internet和集群主机节点,能够Ping通相同子网的虚拟机,能够Ping通Underlay逻辑网关。 排查 a. 新建一个Pod,现象一样 b. 将Underlay子网IP直接配置在主机节点上,网络一切正常 c. 排除了虚拟机网络环境问题和主机节点外网络问题,问题锁定在Kube-OVN网络内部。 比对虚拟机IP和MAC地址都正确 // 路由器列表 sukai@r1-m34:~$ kubectl ko nbctl lr-list 77b2eff6-ce75-4ab4-8476-df34d347a531 (ovn-cluster) // 交换机列表 sukai@r1-m34:~$ kubectl ko nbctl ls-list 4585d35c-3a3d-4dc1-bdb2-9544bf15bbd7 (join) 63abfd74-3513-4edb-83a3-bde609fe3585 (ovn-default) 88910c8a-08b3-49f0-98a0-b21eb21620f2 (vmnet) // 查看我的虚拟机交换机端口 sukai@r1-m34:~$ kubectl ko nbctl lsp-list vmnet f731988d-7cff-44f6-9835-eb8ccdb32216 (localnet.vmnet) 4ff718cb-c3bf-40f4-9fce-a3c141f4639f (sukai-db01.nanjing) 0a02f7b7-caa3-421c-b700-0ea41fd12990 (vmnet-ovn-cluster) sukai@r1-m34:~$ // 查看我的虚拟机交换机端口信息 sukai@r1-m34:~$ kubectl ko nbctl show vmnet switch 88910c8a-08b3-49f0-98a0-b21eb21620f2 (vmnet) port vmnet-ovn-cluster type: router router-port: ovn-cluster-vmnet port sukai-db01.nanjing addresses: ["d2:b9:8d:e6:61:4b 192.168.10.133"] port localnet.

继续阅读

Kubespray添加worker节点并部署OpenEBS lvm-localpv

inventory.ini添加新的主机节点 执行ansible playbook 新节点设置污点仅调度期望的资源 配置Rook Ceph在新节点上安装Ceph RBD CSI插件 部署OpenEBS lvm-localpv分配本地的存储 inventory.ini添加新的主机节点 sukai@r1-m54:~/kubespray-2.26.0/inventory/cluster$ more inventory.ini [all] r4-w58 ansible_host=19.18.136.68 ip=19.18.136.68 [kube_node] r4-w58 执行ansible playbook sukai@r1-m54:~/kubespray-2.26.0$ ansible-playbook -i inventory/cluster/inventory.ini --become playbooks/facts.yml PLAY RECAP ******************************************************************************************************************************************************************************************** r1-m54 : ok=12 changed=0 unreachable=0 failed=0 skipped=14 rescued=0 ignored=0 r4-w58 : ok=12 changed=2 unreachable=0 failed=0 skipped=11 rescued=0 ignored=0 sukai@r1-m54:~/kubespray-2.26.0$ ansible-playbook -i inventory/cluster/inventory.ini --become scale.yml --limit=r4-w58 PLAY RECAP ******************************************************************************************************************************************************************************************** r4-w58 : ok=372 changed=38 unreachable=0 failed=0 skipped=635 rescued=0 ignored=1 sukai@r1-m54:~$ kubectl get nodes -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME r1-m54 Ready control-plane 74d v1.

继续阅读

Kubernetes集群添加主机名解析

单个Pod添加主机别名 CoreDNS添加主机名解析 单个Pod添加主机名别名 dnsPolicy: ClusterFirst hostAliases: - hostnames: - jingxiang.oss-cn-lasa-xzns-d01-a.ops.ningsuan.com.cn - oss-cn-lasa-xzns-d01-a.ops.ningsuan.com.cn ip: 10.65.10.91 initContainers: NodeLocalDNS 169.254.25.10将DNS解析转发到CoreDNS 10.233.0.3 apiVersion: v1 kind: ConfigMap metadata: creationTimestamp: "2024-09-15T01:02:02Z" labels: addonmanager.kubernetes.io/mode: EnsureExists name: nodelocaldns namespace: kube-system resourceVersion: "55695455" uid: 8b2c7245-6563-4a5f-bb11-cbdc5bb9e17c data: Corefile: | cluster.local:53 { errors cache { success 9984 30 denial 9984 5 } reload loop bind 169.254.25.10 forward . 10.233.0.3 { force_tcp } prometheus :9253 health 169.254.25.10:9254 } in-addr.arpa:53 { errors cache 30 reload loop bind 169.

继续阅读

Velero备份Kubernetes资源到阿里云OSS

Velero阿里云OSS插件不再维护,并且只支持阿里云官方平台,不支持私有阿里云平台。Velero AWS插件能够备份Kubernetes资源,但由于阿里云OSS不兼容S3协议,不支持aws-chunked encoding,存储卷快照数据不能上传。本文记录使用AWS插件备份Kubernetes资源。 创建OSS访问密钥和Bucket Helm安装Velero 创建备份 安装ossutil工具,查看Bucket文件 sukai@rack1-master34:~/ossutil$ curl -O curl https://gosspublic.alicdn.com/ossutil/install.sh sukai@rack1-master34:~/ossutil$ sudo bash install.sh sukai@rack1-master34:~/ossutil$ more /home/sukai/.ossutilconfig [Credentials] language=CH accessKeyID=HoOY11111oVQd2 accessKeySecret=etwTS11111111111fUI endpoint=http://oss-cn-lasa-xzns-d01-a.ops.sukai.com.cn skipVerifyCert sukai@rack1-master34:~$ ossutil ls oss://jingxiang LastModifiedTime Size(B) StorageClass ETAG ObjectName 2024-11-20 11:36:31 +0000 UTC 3500 Standard 48CA775C38F20878964AA5088324F21C oss://jingxiang/backups/vms-202411201932/velero-backup.json 2024-11-20 11:35:52 +0000 UTC 471 Standard 7B61AF0F32290A5B39D5881F986D0957 oss://jingxiang/backups/vms-202411201932/vms-202411201932-csi-volumesnapshotclasses.json.gz 2024-11-20 11:35:52 +0000 UTC 6238 Standard 6ACC5E93B590EE6422D38F4A674FC18F oss://jingxiang/backups/vms-202411201932/vms-202411201932-csi-volumesnapshotcontents.json.gz 2024-11-20 11:35:52 +0000 UTC 5033 Standard 997FE590407EFA5E3C286E68066B1D87 oss://jingxiang/backups/vms-202411201932/vms-202411201932-csi-volumesnapshots.json.gz 2024-11-20 11:35:52 +0000 UTC 2373 Standard 6E0C20DB395F60DB5F45403E5B30A026 oss://jingxiang/backups/vms-202411201932/vms-202411201932-itemoperations.

继续阅读

Kubernetes容器存储接口CSI插件controller

前面文章介绍了CSI插件node-agent组件,node-agent主要实现了需要在主机节点上才能进行的操作功能,包含了LVMNode, LVMVolume, LVMSnapshot三个自定义资源控制器和NodeServer接口服务。那么LVMVolume,LVMSnapshot这些自定义资源又是由谁创建的呢?今天我们一起看一下OpenEBS LVM存储插件的Controller部分,了解Controller如何被编排调度系统Container Orchestration system(CO)侧Kubernetes调用,Controller又如何创建自定义资源给Node-Agent调谐的。 之前我们了解到CO侧Kubernetes开发了一系列组件如external-provisioner,external-attacher,external-snapshotter,external-resizer,这些组件通过Sidecar的方式和Plugin插件驱动侧一起运行,直接调用插件Controller的gRPC服务,实现存储卷的管理。下面我们来看一下Controller的接口服务。 Controller Interface包括以下方法 // ControllerServer is the server API for Controller service. type ControllerServer interface { // 创建存储卷,创建自定义资源LVMVolume实例 CreateVolume(context.Context, *CreateVolumeRequest) (*CreateVolumeResponse, error) // 删除存储卷,删除LVMVolume实例 DeleteVolume(context.Context, *DeleteVolumeRequest) (*DeleteVolumeResponse, error) // 挂接存储卷到指定节点,因为LVM是本地设备,末实现 ControllerPublishVolume(context.Context, *ControllerPublishVolumeRequest) (*ControllerPublishVolumeResponse, error) // 卸载存储卷,末实现 ControllerUnpublishVolume(context.Context, *ControllerUnpublishVolumeRequest) (*ControllerUnpublishVolumeResponse, error) // 验证是否支持存储卷访问模式,比如支持单/多机读写,Read-Write-Once ValidateVolumeCapabilities(context.Context, *ValidateVolumeCapabilitiesRequest) (*ValidateVolumeCapabilitiesResponse, error) // 列出所有的存储卷,末实现 ListVolumes(context.Context, *ListVolumesRequest) (*ListVolumesResponse, error) // 返回指定节点的容量信息,可用存储空间 GetCapacity(context.Context, *GetCapacityRequest) (*GetCapacityResponse, error) // 返回controller支持的功能,比如创建/删除存储卷,扩展存储卷,创建删除快照,获取容量 ControllerGetCapabilities(context.Context, *ControllerGetCapabilitiesRequest) (*ControllerGetCapabilitiesResponse, error) // 创建指定存储卷快照 CreateSnapshot(context.

继续阅读

Kubernetes容器存储接口CSI插件node-agent

Kubernetes CSI插件包含两部分:controller, node-agent。今天我们一起来看一下OpenEBS的LVM存储插件,了解OpenEBS如何实现Kubernetes使用LVM逻辑卷存储数据的。LVM逻辑卷管理(Logical Volume Manager),建立在硬盘和分区之上的一个逻辑层,提高磁盘分区管理的灵活性。Kubernetes可以利用LVM本地磁盘提高存储性能,LVM具备快照功能,为KubeVirt虚拟机提供了基于Copy-On-Write的精简配置存储,是一个非常不错的轻量级超融合解决方案。 本文将包含以下几个部分:LVM基本概念,node-agent包含组件,node-agent代码实现。 LVM基本概念 PV物理卷(physical volume),LVM的基本存储逻辑块,一个PV对应一个硬盘或者硬盘分区。VG卷组(Volume Group)由物理卷组成。LV逻辑卷(Logical Volume),建立在卷组之上,一个卷组可以创建多个逻辑卷,一个逻辑卷对应一个卷组。 LVM卷快照(snapshot)用于从文件系统的时间点视图创建备份。从快照备份文件系统,卷本身供用户使用,快照最初包含自身相关的一些元数据,不包含源逻辑卷的实际数据。快照使用写时复制技术Copy-On-Write(COW)在原始数据块的数据发生更改时,复制源块中数据进行更改。 LVM精简卷Thin Provisioned Logical Volumes,精简配置逻辑卷对存储资源进行按需动态分配,即对存储进行了虚拟化管理。在卷组上建立精简池Thin Pool,在精简池上创建精简卷Thin Volume。 node-agent组件 node-agent包含:三个自定义资源控制器,一个gRPC服务。 gRPC服务 Kubelet调用node-agent的gRPC服务接口,将存储卷挂载到本机目录,kubelet创建容器时将目录文件挂载到容器。 NodeServer接口如下: type NodeServer interface { // 挂载存储卷到临时目录 NodeStageVolume(context.Context, *NodeStageVolumeRequest) (*NodeStageVolumeResponse, error) // 从临时目录卸载存储卷 NodeUnstageVolume(context.Context, *NodeUnstageVolumeRequest) (*NodeUnstageVolumeResponse, error) // 发布存储卷,LVM逻辑卷挂载到对应主机指定目录。 NodePublishVolume(context.Context, *NodePublishVolumeRequest) (*NodePublishVolumeResponse, error) // 取消发布存储卷,卸载对应主机上的LVM逻辑卷。 NodeUnpublishVolume(context.Context, *NodeUnpublishVolumeRequest) (*NodeUnpublishVolumeResponse, error) // 返回存储卷统计信息,容量,inodes。 NodeGetVolumeStats(context.Context, *NodeGetVolumeStatsRequest) (*NodeGetVolumeStatsResponse, error) // 扩展存储卷容量。 NodeExpandVolume(context.Context, *NodeExpandVolumeRequest) (*NodeExpandVolumeResponse, error) // 返回主机节点支持的能力,比如支持存储卷扩展,存储卷数据统计。 NodeGetCapabilities(context.Context, *NodeGetCapabilitiesRequest) (*NodeGetCapabilitiesResponse, error) // 返回主机节点信息,主要是Label标签里的拓扑信息。 NodeGetInfo(context.

继续阅读

Kubernetes如何使用不同厂商存储

今天我们一起来看一下Kubernetes如何使用不同厂商存储的,了解一下CSI基本的概念。 基本概念 CSI 容器存储接口Container Storage Interface规范,定义了一个行业标准,使用存储厂商开发的插件可以在多个容器编排系统运行。 PV 持久卷PersistentVolume,Kubernetes集群中的一块存储卷,提供给Pod容器存储数据,通过卷插件(provisioner)来管理,拥有独立于Pod的生命周期。 PVC 持久卷声明PersistentVolumeClaim,用户对存储的资源请求声明。 StorageClass 存储类,集群中可以提供的存储类型。管理员可以创建不同的存储类来对应不同的存储资源,卷插件和策略。 Porvisioner 卷插件根据资料请求信息完成存储设备的卷资源操作。 dynamic provisioning 动态卷配置,基于StorageClass的自动化存储资源的生命周期管理,按用户需求自动动态创建和调整存储资源,用户无需过多关注存储的管理。 下面我们一起来看一下,如何使用动态卷配置。 动态卷配置流程 1,创建一个StorageClass,指定卷插件,回收策略,存储卷绑定模式。 2,用户创建一个PVC持久卷声明,指定卷使用的存储类,读写模式,资源大小,卷类型。 3,卷插件创建持久卷。 4,Kubernetes绑定持久卷和持久卷声明。 5,容器启动时,挂载到容器中使用。 使用示例 创建CSIDriver 创建一个CSI存储插件,当我们的插件注册时会使用相同的名称,Kubernetes的组件根据名称调用插件服务。 --- # Create the CSI Driver object apiVersion: storage.k8s.io/v1 kind: CSIDriver metadata: name: local.csi.sukai.io spec: # do not require volumeattachment attachRequired: false podInfoOnMount: true storageCapacity: true 创建StorageClass 指定provisioner为local.csi.sukai.io apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: openebs-lvmsc allowVolumeExpansion: true parameters: volgroup: "lvmvg" provisioner: local.csi.sukai.io 默认的回收策略为Delete删除策略,当与PV绑定的PVC被删除的时候,删除PV存储资源。另一种策略为Retain保留策略。持久卷绑定模式为Immediate即刻绑定,立即创建持久卷并将其绑定到持久卷声明。WaitForFirstConsumer为首次使用时绑定,第一次被容器组使用时,才创建持久卷,并将其绑定到持久卷声明。

继续阅读

KubeVirt通过Kube-OVN使用Underlay网络

之前文章介绍了如何通过Kube-OVN实现Kubernetes网络租户隔离,今天我们一起看一下KubeVirt通过Kube-OVN使用Underlay网络,使虚拟机接入物理网络。 实践操作 检查Kubernetes使用的Pod网络地址段和Service网络地址段。 sukai@ubuntuserver:/etc/kubernetes/manifests$ sudo grep cidr kube-controller-manager.yaml - --allocate-node-cidrs=true - --cluster-cidr=10.244.0.0/16 sukai@ubuntuserver:/etc/kubernetes/manifests$ sudo grep range kube-controller-manager.yaml - --service-cluster-ip-range=10.211.0.0/16 检查kube-ovn-controller配置项是否正确 kube-ovn在版本v1.11.0开始支持keep-vm-ip参数,虚拟机使用固定IP地址。 Containers: kube-ovn-controller: Container ID: containerd://0f8d53403c9821c7b535c64d2c98e1ca130a15e1b2b878270cd9388c36d0e48a Image: kubeovn/kube-ovn:v1.11.0 Image ID: docker.io/kubeovn/kube-ovn@sha256:fea623e68a2a81ef78102c6cfe95b96c16c054c57f4c8b9d168bd3ff620b6779 Port: <none> Host Port: <none> Args: /kube-ovn/start-controller.sh --default-cidr=10.244.0.0/16 --default-gateway=10.244.0.1 --default-gateway-check=true --default-logical-gateway=false --default-exclude-ips= --node-switch-cidr=100.64.0.0/16 --service-cluster-ip-range=10.211.0.0/16 --network-type=geneve --default-interface-name= --default-vlan-id=100 --pod-nic-type=veth-pair --enable-lb=true --enable-np=true --enable-eip-snat=true --enable-external-vpc=true --keep-vm-ip=true 创建服务网络 指定物理服务器上访问物理网络的网卡。 apiVersion: kubeovn.io/v1 kind: ProviderNetwork metadata: name: office spec: defaultInterface: eno1 创建VLAN 创建在指定服务网络上创建一个VLAN,这里VLAN ID为0表示不属于任何VLAN。 apiVersion: kubeovn.

继续阅读

kube-ovn实现Kubernetes多租户网络管理

Kubernetes容器平台正在成为越来越多的数据中心基础平台,我们希望Kubernetes能够满足虚拟化平台的一些基本要求,比如实现了多租户的灵活的软件定义网络SDN。工作中一个项目在使用Kubernetes平台,所以考虑通过KubeVirt来管理虚拟机,同时使用kube-ovn来实现多租户网络隔离。下面我们一起来看看如何使用kube-ovn来管理网络。 基本概念 Underlay/Overlay网络 Underlay网络是指传统IT基础设施网络,是由交换机、路由器、负载均衡等设备组成的底层物理网络。Overlay网络是通过网络虚拟化技术,在Underlay网络上构建出的虚拟的逻辑网络。 OVS/OVN Open vSwitch(OVS)是一个多层软件交换机,OVS只里一个单机软件,没有集群的信息。Open Virtual Nework(OVN)提供了一个集中式的OVS控制器,从集群的角度对整个网络设施进行编排。 使用Kubernetes后会发现,Kubernetes网络功能缺少软件定义网络SDN能力,缺少VPC, Subnet, Nat, Route, SecurityGroup等常用功能。Kube-OVN基于OVN为Kubernetes网络提供了网络编排能力。 CNI 容器网络接口(Container Network Interface),由CoreOS提出的一种容器网络规范,主要内容是容器创建时的网络分配,和容器被删除时释放网络资源。CNI让网络层变得可插拔,只要遵循CNI的协议规范,容器管理平台就可以调用CNI插件可执行文件提供网络功能。Kubernetes网络模型采用了CNI容器网络接口规范。 macvlan macvlan是一种Linux内核的网络虚拟化技术,从一个主机接口虚拟出多个虚拟网络接口。macvlan可以在物理网卡构成的父接口上添加子接口,每个子接口都拥有独立的MAC地址和IP地址。容器可以通过绑定子接口,拥有与物理网络通信的能力。这解决了容器接入物理网络需求,比如我们需要通过docker运行gitlab服务,gitlab服务需要用到80,443,22端口,这些常用端口经常会产生冲突,那么我们可以通过docker命令创建一个macvlan驱动类型的网络来拥有独立MAC和IP地址。Kubernetes内置CNI插件包含了macvlan,配置使用macvlan CNI,可以让Kubernetes的Pod使用Underlay网络 。 Kube-OVN Kube-OVN插件将Kubernetes容器网络接入ovs网络。提供了vpc, router, switch, subnet管理能力。 Multus Multus CNI插件提供了Kubernetes Pod添加多块网卡的能力。容器同时接入多个不同的网络,解决了类似Ceph这种区分多个网络应用场景。 IPAM IP地址管理(IP Address Management),分配和维护IP地址,DNS,网关,路由等信息。CNI插件在执行过程中调用相应的IPAM插件,IPAM插件将IP相关信息返回到主CNI插件。IPAM插件减少了CNI插件重复编写相同代码管理IP的工作,而且解决了多个CNI插件统一集中IP管理的需求。 场景需求 1,通过VPC实现网络租户隔离 2,通过NAT网关SNAT访问外网 3,通过NAT网关DNAT暴露端口给外网访问 安装部署 安装Kube-OVN curl -O https://raw.githubusercontent.com/kubeovn/kube-ovn/release-1.10/yamls/crd.yaml curl -O https://raw.githubusercontent.com/kubeovn/kube-ovn/release-1.10/yamls/ovn.yaml curl -O https://raw.githubusercontent.com/kubeovn/kube-ovn/release-1.10/yamls/kube-ovn.yaml curl -O https://raw.githubusercontent.com/kubeovn/kube-ovn/master/charts/templates/kubeovn-crd.yaml sed -i 's/\$addresses/<Node IP>/g' ovn.yaml kubectl label node ubuntuserver1 kube-ovn/role=master kubectl apply -f crd.yaml kubectl apply -f kubeovn-crd.

继续阅读

Kubernetes资源类型发现

在基于Kubernetes平台开发过程中,经常需要访问不同Kuberntes版本的集群资源,这时就需要去获取所访问集群支持的资源版本信息。下面我们一起来看一下,如何来实现Kubernetes资源类型发现? 文章分为下面几部分为大家介绍: 1,kubectl命令查看Kubernetes集群资源 2,client-go库获取Kubernetes集群资源 3,controller-runtime动态获取Kubernetes集群资源 kubectl命令 kubectl命令行工具提供api-resources,api-versions命令来查看kubernetes集群当前支持的资源类型。 kubectl api-resources查看k8s所有资源和版本列表。 sukai@sukai:~$ kubectl api-resources NAME SHORTNAMES APIVERSION NAMESPACED KIND bindings v1 true Binding componentstatuses cs v1 false ComponentStatus configmaps cm v1 true ConfigMap endpoints ep v1 true Endpoints events ev v1 true Event limitranges limits v1 true LimitRange namespaces ns v1 false Namespace nodes no v1 false Node persistentvolumeclaims pvc v1 true PersistentVolumeClaim persistentvolumes pv v1 false PersistentVolume pods po v1 true Pod .

继续阅读