k8s单节点搭建一台服务器
⑴ 搭建k8s有哪些方式
#启动etcd
sudodockerrun-d--net=host--name=etcd1-v/etc/kubernetes/ssl:/etc/kubernetes/ssl-v/var/etcd/data/:/var/etcd/data/gcr.io/google_containers/etcd:3.0.17/usr/local/bin/etcd--data-dir=/var/etcd/data
--name=etcd2
--listen-client-urls=http://0.0.0.0:2379
--advertise-client-urls=http://192.168.56.103:2379
--initial-advertise-peer-urls=http://192.168.56.103:2380
--listen-peer-urls=http://192.168.56.103:2380
--initial-cluster=etcd0=http://192.168.56.101:2380,etcd1=http://192.168.56.102:2380,etcd2=http://192.168.56.103:2380
--initial-cluster-state=new
--cert-file=/etc/kubernetes/ssl/kubernetes.pem
--key-file=/etc/kubernetes/ssl/kubernetes-key.pem
--peer-cert-file=/etc/kubernetes/ssl/kubernetes.pem
--peer-key-file=/etc/kubernetes/ssl/kubernetes-key.pem
--trusted-ca-file=/etc/kubernetes/ssl/ca.pem
--peer-trusted-ca-file=/etc/kubernetes/ssl/ca.pem
--initial-cluster-tokenetcd-cluster-0
sudodockerrun-d--net=host--name=etcd0-v/etc/kubernetes/ssl:/etc/kubernetes/ssl-v/var/etcd/data/:/var/etcd/data/gcr.io/google_containers/etcd:3.0.17/usr/local/bin/etcd--data-dir=/var/etcd/data--name=etcd0
--listen-client-urls=http://0.0.0.0:2379--advertise-client-urls=http://0.0.0.0:2379
--initial-cluster-state=new
--cert-file=/etc/kubernetes/ssl/kubernetes.pem
--key-file=/etc/kubernetes/ssl/kubernetes-key.pem
--peer-cert-file=/etc/kubernetes/ssl/kubernetes.pem
--peer-key-file=/etc/kubernetes/ssl/kubernetes-key.pem
--trusted-ca-file=/etc/kubernetes/ssl/ca.pem
--peer-trusted-ca-file=/etc/kubernetes/ssl/ca.pem
#验证
http://10.101.85.159:2379/v2/members
etcdctl--ca-file=/etc/kubernetes/ssl/ca.pem
--cert-file=/etc/kubernetes/ssl/kubernetes.pem
--key-file=/etc/kubernetes/ssl/kubernetes-key.pem
cluster-health
#启动api
sudodockerrun-d--net=host--name=kube-apiserver-v/etc/kubernetes:/etc/kubernetesgcr.io/google_containers/hyperkube:v1.6.1/hyperkubeapiserver
--service-cluster-ip-range=10.254.0.0/16
--advertise-address=192.168.56.101--bind-address=192.168.56.101--insecure-bind-address=192.168.56.101
--kubelet-port=10250
--port=8080
--allow-privileged=true
--admission-control=ServiceAccount,NamespaceLifecycle,NamespaceExists,LimitRanger,ResourceQuota
--authorization-mode=RBAC
--runtime-config=rbac.authorization.k8s.io/v1beta1
--kubelet-https=true
--experimental-bootstrap-token-auth
--token-auth-file=/etc/kubernetes/token.csv
--service-node-port-range=30000-32767
--tls-cert-file=/etc/kubernetes/ssl/kubernetes.pem
--tls-private-key-file=/etc/kubernetes/ssl/kubernetes-key.pem
--client-ca-file=/etc/kubernetes/ssl/ca.pem
--service-account-key-file=/etc/kubernetes/ssl/ca-key.pem
--v=0
--logtostderr=true
--allow-privileged=true
--etcd-cafile=/etc/kubernetes/ssl/ca.pem
--etcd-certfile=/etc/kubernetes/ssl/kubernetes.pem
--etcd-keyfile=/etc/kubernetes/ssl/kubernetes-key.pem
--etcd-servers=http://192.168.56.101:2379,http://192.168.56.102:2379,http://192.168.56.103:2379
--audit-log-maxage=30--audit-log-maxbackup=3--audit-log-maxsize=100--event-ttl=1h
#kube-controller-manager
sudodockerrun-d--net=host--name=kube-controller-manager-v/etc/kubernetes:/etc/kubernetesgcr.io/google_containers/hyperkube:v1.6.1/hyperkubecontroller-manager
--master=http://192.168.56.101:8080
--service-cluster-ip-range=10.254.0.0/16
--cluster-signing-cert-file=/etc/kubernetes/ssl/ca.pem
--cluster-signing-key-file=/etc/kubernetes/ssl/ca-key.pem
--service-account-private-key-file=/etc/kubernetes/ssl/ca-key.pem
--root-ca-file=/etc/kubernetes/ssl/ca.pem
--v=2--leader-elect=true
#scheler
sudodockerrun-d--net=host--name=kube-scheler-v/etc/kubernetes:/etc/kubernetesgcr.io/google_containers/hyperkube:v1.6.1/hyperkubescheler
--master=http://192.168.56.101:8080
--v=2--leader-elect=true
FLANNEL_NETWORK=192.168.0.0/16
FLANNEL_SUBNET=192.168.40.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=false
etcdctl--ca-file=/etc/kubernetes/ssl/ca.pem
--cert-file=/etc/kubernetes/ssl/kubernetes.pem
--key-file=/etc/kubernetes/ssl/kubernetes-key.pem
set/coreos.com/network/config"{"Network":"10.254.0.0/16","Backend":{"Type":"vxlan"}}"
etcdctl--ca-file=/etc/kubernetes/ssl/ca.pem
--cert-file=/etc/kubernetes/ssl/kubernetes.pem
--key-file=/etc/kubernetes/ssl/kubernetes-key.pem
get/coreos.com/network/config
#网络配置
./flanneld--etcd-endpoints=http://192.168.56.101:2379,http://192.168.56.102:2379,http://192.168.56.103:2379-etcd-cafile=/etc/kubernetes/ssl/ca.pem-etcd-certfile=/etc/kubernetes/ssl/kubernetes.pem-etcd-keyfile=/etc/kubernetes/ssl/kubernetes-key.pem>/var/log/flanneld2>&1&
./mk-docker-opts.sh-i
cat/run/flannel/subnet.env
source/run/flannel/subnet.env
ifconfigdocker0${FLANNEL_SUBNET}
SUBNET=10.254.0.0/16
defaultgw=`route-n|grep'^0.0.0.0'|awk'{print$2}'`
iproutedel$SUBNETvia$defaultgwdeveth0
iprouteadd$SUBNETvia0.0.0.0devflannel.1
10.254.51.0/24
/etc/systemd/system/multi-user.target.wants/docker.service
--disable-legacy-registry--bip=192.168.35.1/24--ip-masq=false--mtu=1450
sudosystemctldaemon-reload
sudosystemctlrestartdocker
#
-bootstrap
--server=http://192.168.56.101:8080
--clusterrole=system:node-bootstrapper
--user=kubelet-bootstrap
#启动
hyperkubekubelet--api-servers=http://192.168.56.101:8080
--cluster-dns=10.254.0.2
--cluster-domain=cluster.local.
--experimental-bootstrap-kubeconfig=/etc/kubernetes/bootstrap.kubeconfig
--kubeconfig=/etc/kubernetes/kubelet.kubeconfig
--require-kubeconfig--cert-dir=/etc/kubernetes/ssl>/var/log/kubelet2>&1&
#apiserver让其认证通过
kubectlgetcsr
kubectlcertificateapprovecsr-2b308
kubectlgetnodes
#
hyperkubeproxy--master=http://192.168.56.101:8080
--kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig--cluster-cidr=10.254.0.0/16>/var/log/proxy2>&1&
⑵ k8s 基本使用(上)
本文将介绍 k8s 中的一些最基本的命令,并辅以解释一些基本概念来方便理解,也就是说,本文是一篇偏向实用性而非学术性的文章,如果你想提前了解一下 k8s 相关的知识的话,可以通过以下链接进行学习:
k8s 是经典的一对多模型,有一个主要的管理节点 master 和许多的工作节点 slaver 。当然,k8s 也可以配置多个管理节点,拥有两个以上的管理节点被称为 高可用 。k8s 包括了许多的组件,每个组件都是单运行在一个 docker 容器中,然后通过自己规划的虚拟网络相互访问。你可以通过 kubectl get pod -n kube-system 查看所有节点上的组件容器。
在管理节点中会比工作节点运行更多的 k8s 组件,我们就是靠着这些多出来的组件来对工作节点发号施令。他们都叫什么这里就不详细提了。反正对于”基本使用“来说,这些名字并不重要。
要想理解一个东西就要先明白它的内在理念。通俗点就是,k8s 做了什么?为了提供更加可靠的服务,就要增加服务器的数量,减少每个服务器的体量来平摊负载,而越来越多的虚拟机就会带来越来越高的运维成本。如何让少量的运维人员就可以管理数量众多的服务器及其上的服务呢?这就是 k8s 做的工作。
k8s 把数量众多的服务器重新抽象为一个统一的资源池 ,对于运维人员来说,他们面前没有服务器1、服务器2的概念,而是一个统一的资源池,增加新的服务器对运维人员来说,只是增加自资源池的可用量。不仅如此,k8s 把所有能用的东西都抽象成了资源的概念,从而提供了一套更统一,更简洁的管理方式。
接下来,我会把每个基本命令当做一节来进行介绍,并辅以介绍一些基本概念。本文介绍的命令涵盖了增删改查四方面,可参加下面表格,因为篇幅较长,我们将 create 及之后的不那么常用的命令放在下一篇文章 k8s 基本使用(下) 里讲:
接下来进入正题,首先来了解一下 k8s 中最最最常用的命令 kubectl get ,要记住,k8s 把所有的东西都抽象成了资源,而 kubectl get 就是用来查看这些资源的。最常见的资源就是 pod 。
不仅我们自己的服务是要包装成 pod 的,就连 k8s 自己也是运行在一堆 pod 上。接下来就让我们查看一下 k8s 的 pod :
-n 参数指定了要查看哪个命名空间下的 pod 。 k8s 所有的 pod 都被放置在 kube-system 命名空间下。
执行了 kubectl get pod -n kube-system 命令后,你就可以看到如下内容:
其中每一行就是一个资源,这里我们看到的资源是 pod 。你看到的 pod 数量可能和我的不一致,因为这个列表里包含了 k8s 在所有节点上运行的 pod ,你加入的节点越多,那么显示的 pod 也就越多。我们来一列一列的看:
kubectl get 可以列出 k8s 中所有资源
这里只介绍了如何用 kubectl 获取 pod 的列表。但是不要把 get 和 pod 绑定在一起,pod 只是 k8s 中的一种服务,你不仅可以 get pod ,还可以 get svc ( 查看服务 )、 get rs ( 查看副本控制器 )、 get deploy ( 查看部署 )等等等等,虽然说 kubectl get pod 是最常用的一个,但是如果想查看某个资源而又不知道命令是什么, kbuectl get <资源名> 就对了。
如果你想看更多的信息,就可以指定 -o wide 参数,如下:
加上这个参数之后就可以看到资源的所在 ip 和所在节点 node 了。
记得加上 -n
-n 可以说是 kubectl get 命令使用最频繁的参数了,在正式使用中,我们永远不会把资源发布在默认命名空间。所以,永远不要忘记在 get 命令后面加上 -n 。
kubectl get 命令可以列出 k8s 中的资源,而 kubectl get pod 是非常常用的查看 pod 的命令。而 -n 参数则可以指定 pod 所在的命名空间。
kubectl describe 命令可以用来查看某一资源的具体信息,他同样可以查看所有资源的详情, 不过最常用的还是查看 pod 的详情 。他也同样可以使用 -n 参数指定资源所在的命名空间。
举个例子,我们可以用下面命令来查看刚才 pod 列表中的某个 pod,注意不要忘记把 pod 名称修改成自己的:
然后你就可以看到很多的信息,咱们分开说,首先是基本属性,你可以在详细信息的开头找到它:
基本属性
其中几个比较常用的,例如 Node 、 labels 和 Controlled By 。通过 Node 你可以快速定位到 pod 所处的机器,从而检查该机器是否出现问题或宕机等。通过 labels 你可以检索到该 pod 的大致用途及定位。而通过 Controlled By ,你可以知道该 pod 是由那种 k8s 资源创建的,然后就可以使用 kubectl get <资源名> 来继续查找问题。例如上文 DaemonSet/kube-flannel-ds-amd64 ,就可以通过 kubectl get DaemonSet -n kube-system 来获取上一节资源的信息。
内部镜像信息
在中间部分你可以找到像下面一样的 Containers 段落。该段落详细的描述了 pod 中每个 docker 容器的信息,常用的比如 Image 字段,当 pod 出现 ImagePullBackOff 错误的时候就可以查看该字段确认拉取的什么镜像。其他的字段名都很通俗,直接翻译即可。
事件
在 describe 查看详情的时候,最常用的信息获取处就是这个 Event 段落了,你可以在介绍内容的末尾找到它,如下:
是的,如果你看到上面这样,没有任何 Events 的话,就说明该 pod 一切正常。当 pod 的状态不是 Running 时,这里一定会有或多或少的问题,长得像下面一样,然后你就可以通过其中的信息分析 pod 出现问题的详细原因了:
kubectl describe <资源名> <实例名> 可以查看一个资源的详细信息,最常用的还是比如 kubectl describe pod <pod名> -n <命名空间> 来获取一个 pod 的基本信息。如果出现问题的话,可以在获取到的信息的末尾看到 Event 段落,其中记录着导致 pod 故障的原因。
如果你想查看一个 pod 的具体日志,就可以通过 kubectl logs <pod名> 来查看。注意,这个只能查看 pod 的日志。通过添加 -f 参数可以持续查看日志。例如,查看 kube-system 命名空间中某个 flannel pod 的日志,注意修改 pod 名称:
然后就可以看到如下输出:
如果你发现某个 pod 的服务有问题,但是状态还是显示 Running ,就可以使用 kubectl logs 来查看其详细日志。
在本篇文章里,我们了解了 k8s 的宗旨和一些基本概念,并知道了最为常用的 get 、 descibe 及 logs 命令,知道了这三条命令之后就几乎可以从 k8s 中获取所有常用信息了。接下来的 k8s 基本使用(下) 里,我们会更深一步,来了解 k8s 中如何创建、修改及删除资源。
⑶ 基于linux自己初步搭建Kubernetes(k8s)集群基础,详细教程
k8s官方网站:https://kubernetes.io/zh/,可自行查看相关文档说明
k8s-master:Ubuntu--192.168.152.100
k8s-node01:Ubuntu--192.168.152.101
k8s-node02:Ubuntu--192.168.152.102
全部已安装docker,未安装可根据官方文档安装:https://docs.docker.com/get-docker/
1,禁止swap分区
K8s的要求,确保禁止掉swap分区,不禁止,初始化会报错。
在每个宿主机上执行:
2,确保时区和时间正确
时区设置
3,关闭防火墙和selinux
ubuntu 查看防火墙命令,ufw status可查看状态,ubuntu20.04默认全部关闭,无需设置。
4,主机名和hosts设置(可选)
非必须,但是为了直观方便管理,建议设置。
在宿主机分别设置主机名:k8s-master,k8s-node01,k8s-node02
hosts设置
1,更改docker默认驱动为systemd
为防止初始化出现一系列的错误,请检查docker和kubectl驱动是否一致,否则kubectl没法启动造成报错。版本不一样,docker有些为cgroupfs,而kubectl默认驱动为systemd,所以需要更改docker驱动。
可查看自己docker驱动命令:
更改docker驱动,编辑 /etc/docker/daemon.json (没有就新建一个),添加如下启动项参数即可:
重启docker
需要在每台机器上安装以下的软件包:
2,更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包
安装软件包以允许apt通过HTTPS使用存储库,已安装软件的可以忽略
3,下载公开签名秘钥、并添加k8s库
国外 :下载 Google Cloud 公开签名秘钥:
国内:可以用阿里源即可:
请注意,在命令中,使用的是Ubuntu 16.04 Xenial 版本, 是可用的最新 Kubernetes 存储库。所以而非20.04 的focal。
4,更新 apt 包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本
锁定版本,防止出现不兼容情况,例如,1.7.0 版本的 kubelet 可以完全兼容 1.8.0 版本的 API 服务器,反之则不可以。
只需要在master上操作即可。
1,初始化错误解决(没有报错的可以跳过这条)
错误提示1:
原因:kubectl没法启动,journalctl -xe查看启动错误信息。
解决方案:k8s建议systemd驱动,所以更改docker驱动即可,编辑 /etc/docker/daemon.json (没有就新建一个),添加如下启动项参数即可:
重启docker和kubectel
错误提示2:
原因:初始化生产的文件,重新初始化,需要删除即可
错误提示3:
解决方法:重置配置
2,初始化完成
无报错,最后出现以下,表示初始化完成,根据提示还需要操作。
根据用户是root或者普通用户操作,由于大多环境不会是root用户,我也是普通用户,所以选择普通用户操作命令:
如果是root用户,执行以下命令:
初始化完成,用最后的提示命令 kubeadm join.... 在node机器上加入集群即可。
3,主节点pod网络设置
主节点支持网络插件:https://kubernetes.io/zh/docs/concepts/cluster-administration/addons/
这里安装Calico网络插件:https://docs.projectcalico.org/getting-started/kubernetes/self-managed-onprem/onpremises
Calico官网提供三种安装方式,1)低于50个节点,2)高于50个节点,3)etcd datastore(官方不建议此方法)。
这里选择第一种:
安装完成后, kubectl get node 可查看节点状态,由NotReady变成Ready则正常,需要等几分钟完成。
1,node加入master节点
在所有node节点机器操作,统一已安装完成 kubelet、kubeadm 和 kubectl,用master初始化完成后最后提示命令加入,切记要用root用户。
加入成功后,提示如下:
再次查看kubelet服务已正常启动。
2,需注意的坑
1:加入主节点,需要 root 用户执行词条命令,才可以加入master主节点。
node在没有加入主节点master之前,kubelet服务是没法启动的,是正常情况,会报错如下:
原因是缺失文件,主节点master初始化 `kubeadm init`生成。
node节点是不需要初始化的,所以只需要用root用户`kubeadm join`加入master即可生成。
2:如果加入提示某些文件已存在,如:
原因是加入过主节点,即使没成功加入,文件也会创建,所以需要重置节点,重新加入即可,重置命令:
3,在master查看节点
加入完成后,在master节点 kubectl get node 可查看已加入的所有节点:
这里k8s集群创建完成,下一步使用可参考我的下一篇文章:k8s初步熟悉使用介绍,实践搭建nginx集群
⑷ 如何在Kubernetes中部署一个高可用的Postgresql集群环境
虽然 kubernetes 社区一直在努力使得有状态应用成为一等公民,也推出了 statefulset 控制器支持 pod 的顺序部署,稳定的域名访问和存储访问。但鉴于 MySQL 部署运维的多样性和复杂性,在 kubernetes 上部署 MySQL 仍然要面临众多挑战。
1、业务流量入口的配置方式
传统虚拟机环境下,我们通过虚IP的方式,让业务应用都配置事先定义的一个虚IP为链接数据库的地址,然后由高可用服务保证虚IP始终能被路由到master数据库。在kubernetes中,出现了一层网络插件屏蔽了底层网络拓扑,高可用服务管理虚IP的方式需要随之适应调整,比如通过service结合标签完成虚IP的漂移,但service本身是kubernetes提供的一项功能,其可靠性和性能都取决于kubernetes服务的稳定。以性能来说,service是kubeproxy组件通过配置iptables实现的,当iptables规则较多时不可避免的会产生时延,需要我们针对性的解决。
2、容器隔离带来的监控视野问题
在 kubernetes 中,如果将 MySQL 制作为 container 运行在一个 pod 中,container 会将 MySQL 进程和运行环境隔离在一个单独的 namespace 中。监控组件在获取 MySQL 的一些 metirc 时,可能不得不进入与 MySQL 同一个 namespace 中,在部署和设计监控组件时需要考虑到这些限制。
3、存储在 kubernetes 中,支持配置各种不同的存储。
如果使用本地存储 local persistent volume,则需要绑定 MySQL 在一个固定的节点,这就完全浪费了 kubernetes 灵活调度的天然优势;而如果使用远程共享存储,确实是将 MySQL 进程与其存储完全解耦,使得 MySQL 进程可以在任意节点调度,然而考虑到高 I/O 吞吐量的情况,就不是那么美好了。设计时需要考量远程存储是否能够满足 MySQL 的带宽要求。
4、高可用/备份恢复
kubernetes 提供的 statefulset 控制器只能提供最基本的部署,删除功能,无法实现完善的 MySQL 集群高可用/备份恢复操作。对于有状态应用的部署,仍需要定制开发,所以多数公司提供了定制的 operator 来完成应用容器的管理。比如 etcd operator,MySQL operator,后文将为大家详述我测试使用 MySQL operator 的一些记录。
⑸ 服务器搭建k8s内存需要多大
你好!2gb或者4gb都行
1.什么是k8s?
k8s是一个docker容器管理工具
它是一个全新的基于容器技术的分布式架构领先方案,是开源的容器集群管理系统。
在docker的基础上,为容器化的应用提供部署运行,资源调度,服务发现和动态伸缩等一系列完整功能
2.----k8s的优势:
a,容器编排
b,轻量级
c,开源
d,弹性伸缩
e,负载均衡
二:k8s的核心功能
1.自愈: 重新启动失败的容器,在节点不可用时,替换和重新调度节点上的容器,对用户定义的健康检查不响应的容器会被中止,并且在容器准备好服务之前不会把其向客户端广播。
弹性伸缩: 通过监控容器的cpu的负载值,如果这个平均高于80%,增加容器的数量,如果这个平均低于10%,减少容器的数量
服务的自动发现和负载均衡: 不需要修改您的应用程序来使用不熟悉的服务发现机制,Kubernetes 为容器提供了自己的 IP 地址和一组容器的单个 DNS 名称,并可以在它们之间进行负载均衡。
滚动升级和一键回滚: Kubernetes 逐渐部署对应用程序或其配置的更改,同时监视应用程序运行状况,以确保它不会同时终止所有实例。 如果出现问题,Kubernetes会为您恢复更改,利用日益增长的部署解决方案的生态系统。
⑹ k8s 网络基础
author:sufei
说明:本文主要记录在学习k8s网络方面的相关知识
Linux在内核网络栈中引入网络命名空间,将 独立的网络协议栈隔离 到不同的命令空间中,彼此间无法通信;
1、Linux操作系统,解析和封装网络包是通过一个网络协议栈完成,下层为上层服务,这个 协议栈中即包括如软件也包括硬件网络设 备。网络命名空间就是以软件方式隔离出单独的网络栈信息;
2、不同network namespace的软硬件资源相互不可见,好像处在物理隔离的不同物理机上一样,彼此隔离;
3、不同的网络命名空间会有自己独立的网卡、路由表、ARP 表、iptables 等和网络相关的资源
4、实验:可以借助 ip netns 命令来完成对 Network Namespace 的各种操作,如:
问题 :什么是转移设备?
可以在不同的 Network Namespace 之间转移设备(如veth)。由于一个设备只能属于一个 Network Namespace ,所以转移后在这个 Network Namespace 内就看不到这个设备了。 veth设备属于可转移设备 ,而很多其它设备(如lo、bridge等)是不可以转移的。
veth pair 全称是 Virtual Ethernet Pair,是一个成对的端口,所有从这对端口一 端进入的数据包都将从另一端出来,反之也是一样。而veth pair就是为了在不同的 Network Namespace 直接进行通信,利用它可以直接将两个 Network Namespace 连接起来。
实验
veth pair打破了 Network Namespace 的限制,实现了不同 Network Namespace 之间的通信。但veth pair有一个明显的缺陷,就是只能实现两个网络接口之间的通信。如果我们想实现多个网络接口之间的通信,就可以使用下面介绍的网桥(Bridge)技术( 类似于物理交换机 )。
简单来说,网桥就是把一台机器上的若干个网络接口“连接”起来。其结果是,其中一个网口收到的报文会被复制给其他网口并发送出去。以使得网口之间的报文能够互相转发。
网桥是一个二层网络设备,通过网桥可以将linux支持的不同的端口连接起来,并实现类似交换机那样的多对多的通信。
实验:
Netfilter负责在内核中执行各种挂接的规则(过滤、修改、丢弃等),运行在内核 模式中;Iptables模式是在用户模式下运行的进程,负责协助维护内核中Netfilter的各种规则表;通过二者的配合来实现整个Linux网络协议栈中灵活的数据包处理机制。
iptables/netfilter(简称iptables)组成了Linux平台下的包过滤防火墙,可以完成封包过滤、封包重定向和网络地址转换(NAT)等功能。这部分主要了解两部分知识:
应用层不管是要发送还是接收网络消息,都需要通过linux内核提供的一系列关卡。每个”关卡“担负着不同的工作。这里的”关卡“被称为”链“。如下图:
Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关(如上面的172.17.0.1)。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法通过直接Container-IP访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即docker run创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。
下面具体来说说docker容器的几种网络模式,以便后续学习k8s网络。
在host模式下( –net=host),容器不会去建立新的网络命名空间,而直接使用宿主机的网络设备以及网络协议栈。这样自然不会虚拟出自己的网卡,配置自己的IP等。其特点如下:
这个模式就是在创建容器时,指定网络(–net=container:NAME_or_ID)与之前容器在同一个网络命名空间中,而不是和宿主机共享(这也就是k8s中pod内各容器的一种网络模式)。下面说明几点:
none模式(–net=none)Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
bridge模式是docker容器的默认模式,当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器在bridge模式下会连接到这个虚拟网桥上,并由网桥自动分配ip。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
下面说明这个模式下的工作方式:
首先我们来看看k8s想要一个什么样的网络,也就是k8s网络设计的要求,具体如下:
下面简单从几中不同的通信要求来看看k8s网络实现。
在 Kubernetes 的世界里,IP 是以 Pod 为单位进行分配的。一个 Pod 内部的所有容器共享一个网络堆栈。实际上就是docker container网络模式。可以直接通过本地localhost进行网络访问。这个模式在mysql容器化中就是agent容器与mysql容器的网络通信方式。
Pod1和Pod2都是通信veth pair连接到同一个docker0网桥上,它们的IP地址都是从docker0网段上动态获取的,它们和网桥本身的IP是同一个网段的。可以通过docker0作为交换机进行通信,也就是采用的docker bridge网络模式进行通信。
由于在同一个网桥docker0上即可以保证分配的pod IP不会冲突,且可以相互通信,而如果需要跨Node物理节点,则无法通过docker网络直接满足要求了,那这些要求具体有哪些呢?
解决方案
方法一:k8s中通过在etcd中记录正在运行中pod的IP分配信息,这样我们就可以满足Pod IP与Node IP之间映射关系的记录;
方法二:可以在etcd中规划配置好所有主机docker0网桥的子网范围,从而满足Pod IP不冲突的要求;如:
方法三:要实现Pod跨Node通信,以k8s默认网络Flannel为例,就是采用overlay(覆盖网络)实现。具体下面说明:
问题:什么是覆盖网络?
覆盖网络就是应用层网络,是指建立在另一个网络上的网络。怎么理解呢?简单理解就是将TCP数据包装在另一种网络包里面进行路由转发和通信,另一种网络包目前可以是UDP、VxLAN、AWS VPC和GCE路由等数据转发方式。默认以UDP为例来说明flannel工作方式。
下面看看具体实现
问题 :为保证各node内docker容器分配的ip地址不冲突,每个节点上的Docker会使用不同的IP地址段?如何实现的呢?
问题 :为什么在发送节点上的数据会从docker0路由到flannel0虚拟网卡,在目的节点会从flannel0路由到docker0虚拟网卡?
⑺ K8S安装和创建集群终极教程(单master多worker)
本文会以 最简单 、 最直接 、 最完整 的方式记录kubernetes(下面统称K8S)单master多工作节点(worker nodes)的集群步骤
首先要简单了解一下本文的3个核心概念:
内存建议至少4G
问:如何查看主机名?
答:执行命令hostname
问:如何修改主机名?
答:永久生效的做法:执行命令vi /etc/hostname,把第一行去掉(不能注释掉,要去掉),然后重新写上自定义的主机名(注意命名规范),保存并重启后生效;
临时生效的做法:执行以下命令
问:如何查看MAC地址?
答:执行命令ip link,然后看你的第一网卡
问:如何查看proct_uuid?
答:执行命令sudo cat /sys/class/dmi/id/proct_uuid
注意:30000-32767这个端口范围是我们创建服务的端口必须要设置的一个范围(如果设置范围以外的会有限制提示并创建失败),这是K8S规定的。
另外,如果你要直接关闭防火墙可以执行
⑥必须禁用Swap
Swap total大于0,说明Swap分区是开启的
问:如何关闭Swap?
答:编辑文件/etc/fstab,在swap行前面加上#号注释, 保存并重启服务器
再次查看分区状态,已生效
常见的容器引擎(Container runtime,简称runtime):
本文使用的容器引擎是Docker
安装完成后查看版本:
当出现可能跟Docker引擎相关的奇怪异常时可以尝试把Docker卸载干净并重新安装,但一定要注意镜像、容器、卷或配置文件这些是否需要备份。
下面记录卸载Docker引擎的步骤:
①卸载 Docker Engine、CLI 和 Containerd 包:
②主机上的映像、容器、卷或自定义配置文件不会自动删除。删除所有镜像、容器和卷:
③配置文件如果有不合法的字符时会导致启动失败,我们需要将其删除然后重建
此时Docker引擎已卸载干净
官网用的是谷歌的yum源,因为国内是连不上的,所以这里替换成阿里提供的yum源
①安装
从安装信息中可以看到版本号是1.22
Installing:
kubeadm x86_64 1.22.4-0 kubernetes 9.3 M
kubectl x86_64 1.22.4-0 kubernetes 9.7 M
kubelet x86_64 1.22.4-0 kubernetes 20 M
②启动
这就是一个驱动程序,注意cgroup和cgroupfs不要混淆了
引用官方的一段话
“由于 kubeadm 把 kubelet 视为一个系统服务来管理,所以对基于 kubeadm 的安装, 我们推荐使用 systemd 驱动,不推荐 cgroupfs 驱动。”
kubeadm默认是使用systemd 驱动,而我们的Docker默认驱动是cgroupfs(docker info可以查看),所以需要将Docker的驱动改成systemd
①编辑Docker配置文件
②重启Docker服务
再次docker info查看驱动信息已变成了systemd
工作节点(worker nodes)的最小配置就到这里了
①镜像源参数说明
默认情况下, kubeadm 会从 k8s.gcr.io 仓库拉取镜像,国内是拉不了的。官方文档明确表示允许你使用其他的 imageRepository 来代替 k8s.gcr.io。
--image-repository 你的镜像仓库地址
接下来我找了一些国内的镜像源,并简单做了下分析
综合上述统计,我选择阿里云的镜像源
②ip地址范围参数说明
--pod-network-cidr =192.168.0.0/16
注意:如果192.168.0.0/16已经在您的网络中使用,您必须选择一个不同的pod网络CIDR,在上面的命令中替换192.168.0.0/16。
集群初始化命令:
因为我用的是演示机器,所以这里把完整的执行信息都贴出来方便查阅,平时工作中一定要注意保护好敏感的信息(我的ip地址范围是自定义的便于下面的功能演示,另外初次init需要下载镜像文件,一般需要等几分钟)
如上所示,集群初始化成功,此时一定要注意看上面执行结果最后的那部分操作提示,我已用标明了初始化成功后还需要执行的3个步骤
注意:如果init成功后发现参数需要调整,可以执行kubeadm reset,它的作用是尽最大努力恢复kubeadm init 或者 kubeadm join所做的更改。
To start using your cluster, you need to run the following as a regular user:
翻译:开始使用集群前,如果你是普通用户(非root),你需要执行以下的命令:
Alternatively, if you are the root user, you can run:
翻译:或者,如果你使用的是root,你可以执行以下命令:
(注意:export只是临时生效,意味着每次登录你都需要执行一次)
网络配置配的就是Pod的网络,我的网络插件选用calico
cidr就是ip地址范围,如果您使用 pod CIDR 192.168.0.0/16,请跳到下一步。
但本文中使用的pod CIDR是192.100.0.0/16,所以我需要取消对清单中的 CALICO_IPV4POOL_CIDR 变量的注释,并将其设置为与我选择的 pod CIDR 相同的值。(注意一定要注意好格式,注意对齐)
可根据需求自定义清单,一般不需要的就直接跳过这步
在所有的工作节点上执行join命令(复制之前初始化成功后返回的加入集群命令到所有的工作节点执行即可)
master上查看所有节点的状态
到这里集群已经创建完成
最后我再安装K8S的可视化界面kubernetes-dashboard,方便我们日常使用
①下载yaml文件
②修改yaml文件,新增type和nodePort,使服务能够被外部访问
③安装并查看运行情况
④新建用户
文件创建完成后保存并apply
⑤获取Token,用于界面登录
⑥登录dashboard
192.168.189.128是我的master服务器ip,另外要注意必须使用https,并且不能使用ie内核模式
复制⑤生成的token到输入框,点击登录
dashboard安装配置完成
问:如何在查看资源情况?
答:在master上执行以下命令可查看资源情况(-o wide是显示更详细的信息),
①查看所有节点
②查看所有命名空间
③查看命名空间下的pod
④查看所有命名空间的pod
⑤实时查看查看命名空间下的pod运行情况
问:kubeadm join 出现异常[ERROR Port-10250]: Port 10250 is in use,如何解决?
答:这是因为你之前join失败过了,需要先执行kubeadm reset再重新join
问:虚拟机上测试时网卡突然消失如何解决(题外问题记录)?
答:
①确认丢失的网卡信息,ens开头(可选步骤)
ifconfig -a
②执行以下命令解决
问:如何查看K8S版本?
答:kubectl version
问:join命令忘记或者过期了怎么办?
答:
生成永不过期的
生成时效24小时的
问:Pod不断重启并且无其它报错信息时怎么办?
答:这种情况通常是因为你的集群中只有master,没有worker节点,master的创建默认是有污点的,即不允许调度新的Pod,如果你需要(当然这并不推荐),就需要删除 master 上的污点。删除污点可以执行以下命令,
它应该返回以下内容。
⑻ 什么是K8S
k8s全称kubernetes,这个名字大家应该都不陌生,k8s是为容器服务而生的一个可移植容器的编排管理工具,越来越多的公司正在拥抱k8s,并且当前k8s已经主导了云业务流程,推动了微服务架构等热门技术的普及和落地,正在如火如荼的发展。想要了解更多,我推荐你去看看时速云,他们是一家全栈云原生技术服务提供商,提供云原生应用及数据平台产品,其中涵盖容器云PaaS、DevOps、微服务治理、服务网格、API网关等。大家可以去体验一下。
希望能给您提供帮助,可以给个大大的赞不。