安安 - kubernetes
type: channel
link: https://blog.90.vc/tag/kubernetes/
items: Kubernetes 内部组件工作原理
items: 使用kubeadm部署kubernetes1.17.3
items: 国内无法访问gcr.io与quay.io镜像问题
items: Kubernetes CNI网络对比：Flannel、Calico、Canal和Weave
items: kubectl常用命令
items: 使用kubeadmin安装kubernetes 1.15

Kubernetes 内部组件工作原理
type: item
date: 2020-03-31T14:32:00+00:00
description: 翻译自:https://blog.heptio.com/core-kubernetes-jazz-improv-over-orchestration-a7903ea92ca原作者：Joe Beda (Dad of two. CTO of Heptio. Started Google Compute Engine, Kubernetes and Google Container Engine.)本篇文章讲述了Kubernetes内部组件的工作原理，及创建POD的流程。如果你是运维人员或者是Kubernetes的使用者，你可以不需要知道Kubernetes的内部工作原理，但是如果你想理解Kubernetes内部的工作原理，这篇文章非常适合你。读这篇文章的前提是，你已经大致了解并会运用Kubernetes。这篇文章不会去描述什么是Kubernetes及其组件（如：Pod, Node, Kubelet）。 本篇将讨论Kubernetes核心组件及这些核心组件是如何让Kubernetes 对"爵士乐即兴演奏"。通常将像Kubernetes这样的通用系统称为容器的 "管弦乐编排"。但是管弦乐编排，必须有一个预先计划的指挥家。因此，这并不是Kubernetes的一个好的描述。相反，Kubernetes更像是爵士乐即兴演奏，有一系列演员互相配合协调完成演奏。接下来，开始介绍每个核心组件的功能。然后将看一个典型的调度和启动一个Pod的流程。1. Datastore: EtcdEtcd是Kubernetes的存储状态的数据库。虽然Kubernetes系统中有重要的内存缓存，但Etcd被认为是记录系统状态。Etcd的快速总结：它是一个集群分布式数据库，它可以提供分布式数据的一致性。这类的系统（如Zookeeper, Consul）是在 Google开发的chubby系统之后形成的，这些系统也称为"锁服务器"，因为他们可以实现分布式锁。Etcd和chubby的数据模型是一个简单的层次化的Key，并存储了简单的非结构化value，这看起来像是一个文件系统。有意思的是，在Google, chubby 被频繁用于为实现访问本地文件和对象存储的功能的抽象文件接口。然而，分布式数据库的高度一致性，提供了数据的严格写入顺序并允许client原子性的对数据做更新操作。可靠的系统的状态管理是任何系统中非常困难的一件事情。在分布式系统中，它是更加困难的，因为它引入了一致性算法，如raft或paxos。通过使用etcd，Kubernetes可以专注系统的其他部分。Etcd的watch机制是Kubernetes工作的关键。系统允许client去执行轻量级的对于Key值变化事件的订阅。当要watch的数据发生变化时, client会立即得到通知。这可以用作分布式系统组件之间的协调机制。 一个组件一旦写入etcd，其他组件可以立即对该变化作出反应。Etcd的消息机制正好和PubSub消息队列机制相反。在许多消息队列系统系统中，topic不存储真正的用户数据，但发布到这些topic的消息含有丰富的数据。对于像Etcd这样的系统，Key（类似于主题）存储了真实的数据而消息（数据变化通知）不含独特的丰富消息。换句话说，对于消息队列来说，topic很简单，而像Etcd则正好相反。（译者认为此处概括的非常准确）2. Policy Layer: API ServerKubernetes的核心组件是API Server，它是Kubernetes系统和Etcd直接对话的唯一组件。实际上，etcd是API server的实现细节，理论上也可以用其他分布式存储系统来支持Kubernetes.API server是一个策略组件，提供对Etcd的过滤访问。它的作用本质上是相对通用的，目前正在被分解处理。因此，API Server也可以用于其他系统的控制平面。API server的主要货物是资源，通过暴露简单的REST API 向外提供服务。这些资源有一个标准结构可以实现一些扩展功能。无论如何，API Server，允许各类组件创建，读取，写入，更新，和监视资源。API Server的具体的功能：认证和授权。Kubernetes有一个可插拔的认证系统。有一些内置的用户认证机制和授权这些用户访问资源。此外，还有一些方法可用于向外部服务提供这些服务。这种可扩展性是Kubernetes构建的核心功能。API Server运行一组可以拒绝或修改请求的准入控制器。 这些允许策略被应用并设置默认值。 这是确保在API Server客户端仍在等待请求确认时进入系统的数据有效性的关键。 虽然这些准入控制器目前正在编译到API Server中，但目前正在进行的工作是使其成为另一种可扩展性机制。API Server 有助…

使用kubeadm部署kubernetes1.17.3
type: item
date: 2020-02-29T13:28:00+00:00
description: 环境准备操作系统：centos 7 1908 mini设置主机名hostnamectl set-hostname k8s-sh-21.vm.90.vc hostnamectl set-hostname k8s-sh-22.vm.90.vc hostnamectl set-hostname k8s-sh-23.vm.90.vc配置hostsvim /etc/hosts10.0.2.21 k8s-sh-21.vm.90.vc 10.0.2.22 k8s-sh-22.vm.90.vc 10.0.2.23 k8s-sh-23.vm.90.vc防火墙与selinux主机防火墙需要开放相应端口，具体可参考kubernetes官方文档 Check required ports 一节。这里为了方便，直接关闭防火墙systemctl stop firewalld systemctl disable firewalld目前为止，kubernetes还不支持selinux，所以必须将selinux关闭。将 SELinux 设置为 permissive 模式（相当于将其禁用）setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config关闭swap分区自kubernetes1.8版本开始，要求必须关闭swap，否则kubelet无法启动修改/etc/fstab配置文件，注释掉swap行。执行以下操作，关闭swap。swapoff -a sysctl -w vm.swappiness=0 echo "vm.swappiness=0">> /etc/sysctl.conf sysctl -p调整系统参数确保系统加载了 br_netfilter 模块。这可以通过运行 lsmod | grep br_netfilter 来检测。如没有加载则运行如下命令加载modprobe br_netfilter在 RHEL/CentOS 7 中：由于 iptables 可能被绕过而导致流量无法正确路由的问题。因此需要确保 在 sysctl 配置中的 net.bridge.bridge-nf-call-iptables 被设置为 1,在sysctl中添加如下配置cat <<EOF > /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF运行 sysctl --system 生效安装docker从 v1.6.0 版本起，Kubernetes 开始默认允许使用 CRI（容器运行时接口）。从 v1.14.0 版本起，kubeadm 将通过观察已知的 UNIX 域套接字来自动检测 Linux 节点上的容器运行时。如果同时检测到 docker 和 containerd，则优先选择 docker。kubernetes 1.17官方推荐安装 docker 19.03.4 版本，但 1.13.1、17.03、17.06、17.09、18.06 和 18.09 版本也是可以的。安装docker依赖及yum配置工具yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo安装dockeryum -y install docker-ce-19.03.4-3.el7修改docker cgroup driver为systemd，以及一些docker的其他设置cat > /etc/docker/daemon.json <<EOF { "graph": "/data/docker", "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2", "storage-opts": [ "overlay2.override_kernel_check=true" ] } EOF重启docker并运行 docker info |grep cgroup 验证修改kubernetes 安装配置kubernetes的yum源cat <<EOF > /etc/…

国内无法访问gcr.io与quay.io镜像问题
type: item
date: 2020-02-29T11:48:25+00:00
description: 由于众所周知的原因，gcr.io在国内不可访问，quay.io也间歇性抽风。这里可以用azure中国的相关镜像来获取，如下表原始地址国内镜像gcr.iogcr.azk8s.cnquay.ioquay.azk8s.cn

Kubernetes CNI网络对比：Flannel、Calico、Canal和Weave
type: item
date: 2020-02-26T10:38:00+00:00
description: 介绍网络架构是Kubernetes中较为复杂、让很多用户头疼的方面之一。Kubernetes网络模型本身对某些特定的网络功能有一定要求，但在实现方面也具有一定的灵活性。因此，业界已有不少不同的网络方案，来满足特定的环境和要求。CNI意为容器网络接口，它是一种标准的设计，为了让用户在容器创建或销毁时都能够更容易地配置容器网络。在本文中，我们将集中探索与对比目前最流行的CNI插件：Flannel、Calico、Weave和Canal（技术上是多个插件的组合）。这些插件既可以确保满足Kubernetes的网络要求，又能为Kubernetes集群管理员提供他们所需的某些特定的网络功能。背景容器网络是容器选择连接到其他容器、主机和外部网络（如Internet）的机制。容器的runtime提供了各种网络模式，每种模式都会产生不同的体验。例如，Docker默认情况下可以为容器配置以下网络：none：将容器添加到一个容器专门的网络堆栈中，没有对外连接。host：将容器添加到主机的网络堆栈中，没有隔离。default bridge：默认网络模式。每个容器可以通过IP地址相互连接。自定义网桥：用户定义的网桥，具有更多的灵活性、隔离性和其他便利功能。Docker还可以让用户通过其他驱动程序和插件，来配置更高级的网络（包括多主机覆盖网络）。CNI的初衷是创建一个框架，用于在配置或销毁容器时动态配置适当的网络配置和资源。下面链接中的CNI规范概括了用于配制网络的插件接口，这个接口可以让容器运行时与插件进行协调：https://github.com/containernetworking/cni/blob/master/SPEC.md插件负责为接口配置和管理IP地址，并且通常提供与IP管理、每个容器的IP分配、以及多主机连接相关的功能。容器运行时会调用网络插件，从而在容器启动时分配IP地址并配置网络，并在删除容器时再次调用它以清理这些资源。运行时或协调器决定了容器应该加入哪个网络以及它需要调用哪个插件。然后，插件会将接口添加到容器网络命名空间中，作为一个veth对的一侧。接着，它会在主机上进行更改，包括将veth的其他部分连接到网桥。再之后，它会通过调用单独的IPAM（IP地址管理）插件来分配IP地址并设置路由。在Kubernetes中，kubelet可以在适当的时间调用它找到的插件，来为通过kubelet启动的pod进行自动的网络配置。术语在对CNI插件们进行比较之前，我们可以先对网络中会见到的相关术语做一个整体的了解。不论是阅读本文，还是今后接触到其他和CNI有关的内容，了解一些常见术语总是非常有用的。一些最常见的术语包括：第2层网络： OSI（Open Systems Interconnections，开放系统互连）网络模型的“数据链路”层。第2层网络会处理网络上两个相邻节点之间的帧传递。第2层网络的一个值得注意的示例是以太网，其中MAC表示为子层。第3层网络： OSI网络模型的“网络”层。第3层网络的主要关注点，是在第2层连接之上的主机之间路由数据包。IPv4、IPv6和ICMP是第3层网络协议的示例。VXLAN：代表“虚拟可扩展LAN”。首先，VXLAN用于通过在UDP数据报中封装第2层以太网帧来帮助实现大型云部署。VXLAN虚拟化与VLAN类似，但提供更大的灵活性和功能（VLAN仅限于4096个网络ID）。VXLAN是一种封装和覆盖协议，可在现有网络上运行。Overlay网络：Overlay网络是建立在现有网络之上的虚拟逻辑网络。Overlay网络通常用于在现有网络之上提供有用的抽象，并分离和保护不同的逻辑网络。封装：封装是指在附加层中封装网络数据包以提供其他上下文和信息的过程。在overlay网络中，封装被用于从虚拟网络转换到底层地址空间，从而能路由到不同的位置（数据包可以被解封装，并继续到其目的地）。网状网络：网状网络（Mesh network）是指每个节点连接到许多其他节点以协作路由、并实现更大连接的网络。网状网络允许通过多个路径进行路由，从而提供更可靠的网络。网状网格的缺点是每个附加节点都会增加大量开销。BGP：代表“边界网关协议”，用于管理边缘路由器之间数据包的路由方式。BGP通过考虑可用路径，路由规则和特定网络策略，帮助弄清楚如何将数据包从一个网络发送到另一个网络。BGP有时被用作CNI插件中的路由机制，而不是封装的覆盖网络。了解了技术术语和支持各类插件的各种技术之后，下面我们可以开始探索一些最流行的CNI插件了。CNI比较Flannel链接：https://github.com/coreos/flannel由CoreOS开发的项目Flannel，可能是最直接和最受欢迎的CNI插件。它是容器编排系统中最成熟的网络结构示例之一，旨在…

kubectl常用命令
type: item
date: 2020-02-11T11:04:00+00:00
description: 查看所有namespace的pods运行情况kubectl get pods --all-namespaces 查看具体pods，记得后边跟namespace名字哦kubectl get pods kubernetes-dashboard-76479d66bb-nj8wr --namespace=kube-system查看pods具体信息kubectl get pods -o wide kubernetes-dashboard-76479d66bb-nj8wr --namespace=kube-system查看集群健康状态kubectl get cs获取所有deploymentkubectl get deployment --all-namespaces查看kube-system namespace下面的pod/svc/deployment 等等（-o wide 选项可以查看存在哪个对应的节点）kubectl get pod /svc/deployment -n kube-system列出该 namespace 中的所有 pod 包括未初始化的kubectl get pods --include-uninitialized查看deployment()kubectl get deployment nginx-app查看rc和serverskubectl get rc,services查看pods结构信息（重点，通过这个看日志分析错误）对控制器和服务，node同样有效kubectl describe pods xxxxpodsname --namespace=xxxnamespace其他控制器类似吧，就是kubectl get 控制器 控制器具体名称查看pod日志kubectl logs $POD_NAME查看pod变量kubectl exec my-nginx-5j8ok -- printenv | grep SERVICE集群kubectl get cs # 集群健康情况kubectl cluster-info # 集群核心组件运行情况kubectl get namespaces # 表空间名kubectl version # 版本kubectl api-versions # APIkubectl get events # 查看事件kubectl get nodes //获取全部节点kubectl delete node k8s2 //删除节点kubectl rollout status deploy nginx-testkubectl get deployment --all-namespaceskubectl get svc --all-namespaces创建kubectl create -f ./nginx.yaml # 创建资源kubectl apply -f xxx.yaml （创建+更新，可以重复使用）kubectl create -f . # 创建当前目录下的所有yaml资源kubectl create -f ./nginx1.yaml -f ./mysql2.yaml # 使用多个文件创建资源kubectl create -f ./dir # 使用目录下的所有清单文件来创建资源kubectl create -f https://git.io/vPieo # 使用 url 来创建资源kubectl run -i --tty busybox --image=busybox ----创建带有终端的podkubectl run nginx --image=nginx # 启动一个 nginx 实例kubectl run mybusybox --image=busybox --replicas=5 ----启动多个podkubectl explain pods,svc # 获取 pod 和 svc 的文档更新kubectl rolling-update python-v1 -f python-v2.json # 滚动更新 pod frontend-v1kubectl rolling-update python-v1 python-v2 --image=image:v2 # 更新资源名称并更新镜像kubectl rolling-update python --image=image:v2 # 更新 frontend pod 中的镜像kubectl rolling-update python-v1 python-v2 --rollback # 退出已存在的进行中的滚动更新cat pod.json | kubectl replace -f - # 基于 stdin 输入的 JSON 替换 pod为 nginx RC 创建服务…

使用kubeadmin安装kubernetes 1.15
type: item
date: 2019-07-11T06:53:00+00:00
description: kubeadm是Kubernetes官方提供的用于快速安装Kubernetes集群的工具，伴随Kubernetes每个版本的发布都会同步更新，kubeadm会对集群配置方面的一些实践做调整，通过实验kubeadm可以学习到Kubernetes官方在集群配置上一些新的最佳实践。最近发布的Kubernetes 1.15中，kubeadm对HA集群的配置已经达到beta可用，说明kubeadm距离生产环境中可用的距离越来越近了。1.准备1.1系统配置在安装之前，需要先做如下准备。两台CentOS 7.6主机如下：cat /etc/hosts 172.20.0.11 ip-172-20-0-11.cu-sd-cn.vm.7x34.com 172.20.0.12 ip-172-20-0-12.cu-sd-cn.vm.7x34.com 如果各个主机启用了防火墙，需要开放Kubernetes各个组件所需要的端口，可以查看Installing kubeadm中的”Check required ports”一节。 这里简单起见在各节点禁用防火墙：systemctl stop firewalld systemctl disable firewalld禁用SELINUX：setenforce 0 vi /etc/selinux/config SELINUX=disabled创建/etc/sysctl.d/k8s.conf文件，添加如下内容：net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1执行命令使修改生效。modprobe br_netfilter sysctl -p /etc/sysctl.d/k8s.conf1.2kube-proxy开启ipvs的前置条件由于ipvs已经加入到了内核的主干，所以为kube-proxy开启ipvs的前提需要加载以下的内核模块：ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh nf_conntrack_ipv4在所有的Kubernetes节点node1和node2上执行以下脚本:cat > /etc/sysconfig/modules/ipvs.modules <<EOF #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4 EOF chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4上面脚本创建了的/etc/sysconfig/modules/ipvs.modules文件，保证在节点重启后能自动加载所需模块。 使用lsmod | grep -e ip_vs -e nf_conntrack_ipv4命令查看是否已经正确加载所需的内核模块。接下来还需要确保各个节点上已经安装了ipset软件包yum install ipset。 为了便于查看ipvs的代理规则，最好安装一下管理工具ipvsadm yum install ipvsadm。如果以上前提条件如果不满足，则即使kube-proxy的配置开启了ipvs模式，也会退回到iptables模式。1.3安装DockerKubernetes从1.6开始使用CRI(Container Runtime Interface)容器运行时接口。默认的容器运行时仍然是Docker，使用的是kubelet中内置dockershim CRI实现。安装docker的yum源:yum install -y yum-utils device-mapper-persistent-data lvm2 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo查看最新的Docker版本：yum list docker-ce.x86_64 --showduplicates |sort -r docker-ce.x86_64 3:18.09.7-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.6-3.el7 docker-ce-stable do…