从Docker到Kubernetes
2013 年,随着PaaS发展壮大,这个领域的从业者们发现了 PaaS 中最为棘手也最亟待解决的一个问题:究竟如何给应用打包?无论是 Cloud Foundry、OpenShift,还是 Clodify,面对这个问题都没能给出一个完美的答案。一个并不引人瞩目的 PaaS 创业公司 dotCloud,却选择了开源自家的一个容器项目 Docker,正好提供了一种非常便利的打包机制,然后就一发不可收拾,围绕着 Docker 项目进行集成与创新涌现出来,包括Mesosphere公司的Mesos项目等等,Docker 公司也顺势推出了Docker Compose、Swarm 和 Machine“三件套”,docker生态圈很快发展起来了,开启了一个新的容器时代。
2014年6月,谷歌公司正式宣告了Kubernetes项目的诞生。
这个时候容器出现多样化,包括google公司lmctfy容器,coreos的rkt容器。Google公司提出和Docker合作,与Docker公司共同推进一个中立的容器运行时库作为Docker项目的核心依赖。此时Docker并不担心,因为它维护的 Docker 社区也足够庞大,Docker项目已是容器生态的标准。于是,2015 年 6 月 22 日,由 Docker 公司牵头,CoreOS、Google、RedHat 等公司共同宣布,Docker 公司将 Libcontainer 捐出,并改名为 RunC 项目,交由一个完全中立的基金会管理,然后以 RunC 为依据,大家共同制定一套容器和镜像的标准和规范,这就是OCI。
明显OCI的成立容器玩家们出于自身利益进行干涉的一个妥协结果,所以尽管Docker 是 OCI 的发起者和创始成员,但并没有很积极的去推动,Docker注重是它商业价值。 2015年12月11日,Google、RedHat 等开源基础设施领域玩家们,共同牵头发起了一个名为 CNCF(Cloud Native Computing Foundation)的基金,主要是以kubernetes项目为基础打造一个平台级生态。由于Kubernates项目焕然一新的设计理念和号召力,2016年以后kubernates社区得到了空前的发展。
2016年6月,Docker v.1.12发布,直接内置Docker Swarm(多主机多容器的编排解决方案) 2016年12月, Kubernetes 发布 CRI (Container Runtime Interface, 容器运行时接口) 2017年,Docker 分拆了 Containerd,支持CNI,将这个组件分解为一个单独的项目,使得 Docker 将容器的管理功能移出 Docker 引擎,并移入一个单独的守护进程中,即 Containerd,并将其捐赠给了CNCF社区。同时Docker公司宣布将Docker项目改名为Moby,交给社区自行维护。 2017年10月,Docker公司将自己的主打产品Docker EE 内置Kubernetes项目,预示着Kubernetes的胜出,成为容器编排的标准。
2017年11月 ,K8s支持containerd 2018年 k8s集成containerd,正式GA,把CRI plugin嵌入 containerd中 2019年 rkt 终止使命被CNCF归档 2019 年 Mirantis 收购 Docker 的企业服务 OCI 代表 开放容器标准 , 它标准化了容器工具和底层实现(technologies)之间的大量接口。 他们维护了打包容器镜像(OCI image-spec)和运行容器(OCI runtime-spec)的标准规范。 他们还以 runc 的形式维护了一个 runtime-spec 的真实实现, 这也是 containerd 和 CRI-O 依赖的默认运行时。
CRI 建立在这些底层规范之上,为管理容器提供端到端的标准 全称Container Runtime Interface,(容器运行时接口)是一个用来扩展容器运行时的接口,能让 kubelet 无需重新编译就可以广泛使用各种容器运行时的插件接口。CRI 由 protocol buffers 和 gRPC API 还有 streaming 库 构成。用户不需要关心内部通信逻辑,而只需要实现定义的接口就可以,包括 RuntimeService 和 ImageService。 其实准确来讲,Docker和容器不是一回事,但Docker普及了Linux容器这种技术模式,并在开发底层技术方面发挥了重要作用。
容器的生态相比于单纯的 Docker,已经进化到了一个更宽广的领域 2020年 Kubernates 宣布移除dockershim,现在1.20版本以后,能使用但是kubelet会打印警告日志。最新消息dockershim 计划在 Kubernetes 1.24 版被移除, 请参阅 移除 Kubernetes 增强方案 Dockershim 主流的容器运行时有 containerd,docker engine,cri-o,Mirantis Container Runtime(商业版) Containerd是一个工业标准的容器运行时,它强调简单性、健壮性和可移植性。它可以在宿主机中管理完整的容器生命周期:容器镜像的传输和存储、容器的执行和管理、存储和网络等,是目前适用最广泛。 Containerd 的配置文件默认为 /etc/containerd/config.toml[^ssh-copy-id] containerd 将容器相关的数据持久化在 /var/lib/containerd/中(docker 默认在 /var/lib/docker/) containerd 提供ctr CLI。
containerd 相比docker, 多了 namespace 概念, 每个image和container 都会在各自的namespace下可见, 目前k8s会使用k8s.io 作为命名空间。 容器时依赖task,task 管理容器,删除容器,得先终止task CRI Tools是社区针对 CRI 接口开发的CLI及验证工具。 它包括两个工具:crictl 和 critest。crictl 是一个容器运行时命令行接口,适用所有CRI兼容的容器运行时,与Docker cli类似功能,但是docker cli只适用于Docker运行时。
由于Kubernetes 是支持所有CRI兼容的容器运行时,所以推荐crictl用于 Kubernetes 节点上 pod、容器以及镜像的除错工具。 针对pod操作如下: critest 则是一个容器运行时的验证测试工具,用于验证容器运行时是否符合 Kubelet CRI 的要求。除了验证测试,critest 还提供了 CRI 接口的性能测试,比如 critest -benchmark 根据上文内容知道Docker也是依赖Containerd,因此安装Docker同时也安装Containerd,那么切Containerd就可以不用再安装,当然你也可以将 Docker 和 containerd 完全卸载掉,然后重新安装。
一、Mac 下使用虚拟机安装 Kubernetes
电脑 8 核 16 G 1. 安装 VMware 2. 安装 Centos 3. 配置阿里云 a. cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup b. wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo c. yum makecache d. yum update e. yum clean all 4. 配置静态网络(可省略) a. cat /Library/Preferences/VMware Fusion/vmnet8/nat.conf i. 获取 IPADDR ii. 获取 NETMASK b. /qLibrary/Preferences/VMware Fusion/vmnet8/dhcpd.conf i. 获取GATEWAY c. vi /etc/sysconfig/network-scripts/ifcfg-ens33 i. BOOTPROTO=static(ip地址设置为静态的) ii. IPADDR=上面mac中找到的ip范围中设置一个 iii. NETMASK=255.255.255.0(也是从上面得到) iv. GATEWAY=设置上面mac中看到的gatway地址,即router路由地址(192.168.181.2) v. OnBOOT=yes vi. DNS1=x.x.x.x(在mac,网络,高级里面的选项卡能够找到 d. systemctl restart network.service 5. 安装 docker 15 a. mkdir /etc/yum.repos.d/bak b. cp /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak c. wget -O /etc/yum.repos.d/epel.repo http://mirrors.cloud.tencent.com/repo/epel-7.repo d. yum clean all && yum makecache e. yum install -y docker-ce-18.06.1.ce-3.el7 f. systemctl enable docker && systemctl start docker g. docker version 6. 安装 kubernetes a. 配置国内Kubernetes源 cat < /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF b. yum install -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.1 7. 部署 Kubernetes a. systemctl stop firewalld & systemctl disable firewalld 关闭防火墙 b. swapoff -a c. setenforce 0 关闭 Selinux d. 修改/etc/sysconfig/selinux文件 SELINUX=disabled e. 创建/etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 f. sysctl --system g. 进入 /home/你的文件夹 h. kubeadm config print init-defaults > kubeadm.conf i. sed -i "s/advertiseAddress: .*/advertiseAddress: 你的 IP/g" kubeadm.conf j. sed -i "s/podSubnet: .*/podSubnet: \"192.168.0.0\/16\"/g" kubeadm.conf k. sed -i "s/imageRepository: .*/imageRepository: registry.aliyuncs.com\/google_containers/g" kubeadm.conf l. sed -i "s/kubernetesVersion: .*/kubernetesVersion: v1.17.3/g" kubeadm.conf m. kubeadm config images pull --config kubeadm.conf (拉去镜像) n. kubeadm init --config kubeadm.conf 初始化 o. 命令照搬 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config 8. 安装网络插件 a. wget https://docs.projectcalico.org/v3.8/manifests/calico.yaml b. kubectl apply -f calico.yaml c. 查看安装情况:kubectl get pods --all-namespaces 9. kubectl taint nodes --all node-role.kubernetes.io/master- 10. 拍摄快照Windows安装Kubernetes
学习Kubernetes的第一步就需要搭建一个可用的Kubernetes环境,这里针对Windows的安装过程做简要记录 事先安装 Docker Desktop 安装过程中可能会出现错误需要我们及时查看日志来排查问题,日志目录:C:\ProgramData\DockerDesktop 首先确认当前需要安装的版本,从下图中可以看到需要安装的版本为v1.22.4 确认镜像源配置为阿里云镜像加速 由于国内的网络问题,直接启用Kubernetes会无法正常启动,如下图所示进入目录C:\Windows\System32\drivers\etc编辑文件hosts添加一行 否则执行命令会出现如下错误 把勾勾上,等待一段时间,就会发现下发那个kubernetes的点变绿了,代表kubernetes启动成功 由于启动较慢,这里可以通过命令查看容器的启动状态 此时即可以说明环境安装正常 使用kubectl proxy命令访问 打开浏览器访问网址 填入Token并信息登录 进入后可以看到如下页面 清理旧提权 创建集群用户 查token用于登录 登录看板 此时这里可以看到多有的命令空间,且右侧不会再有报错通知消息 此时查看Pod等待正常运行即可 打开浏览器访问 http://localhost:8080/ https://blog.csdn.net/qq_38836770/article/details/108801300 https://wayneshao.com/posts/10324.html https://github.com/AliyunContainerService/k8s-for-docker-desktop/issues/180 https://blog.csdn.net/zhangbaoxiang/article/details/106559533win10下docker开通k8s教程
一、Docker For Windows Stable在Enable Kubernetes这个问题上是有Bug的,建议切换到Edge版本 二、为了更快的完成一些安装,我们先通过一个阿里云的批处理,提前把Kubernetes需要的Images拉取下来,在powershell执行如下: git clone https://github.com/AliyunContainerService/k8s-for-docker-desktop.git cd k8s-for-docker-desktop .\load_images.ps1 无法加载文件 .ps1,因为在此系统中禁止执行脚本 以管理员身份运行powershell 执行 set-executionpolicy remotesigned 输入y即可 三、切换Settings到Kubernetes,勾选开启项进行安装,这个过程可能比较久。四、获取所有的上下文。
Kubernetes(K8S)入门与安装配置
Kubernetes 是一个跨主机集群的开源的容器调度平台,它可以自动化应用容器的部署、扩展和操作 , 提供以容器为中心的基础架构。谷歌旗下开源软件,江湖人称K8S。
上图是一个通过K8S搭建的集群环境,采用三台物理机搭建(三台机器是K8S搭建集群的最低要求),我先简单介绍一下几个重点名词。
Centos 7 Master * 1 (注意必须是双核以上的CPU,否则无法初始化K8S)Centos 7 Node * 2将文件上传至该目录网盘地址: https://pan.baidu.com/s/1NiAdf0Gp24qjVx2v_HqqyQ提取码:aew7执行以下命令如果不是groupfs,执行下列语句将最后一行注释运行docker images可以看到以下几个关键应用kube-proxy 容器间通讯代理、kube-apiserver API服务端、kube-scheduler 任务调度器、kube-controller-manager 集群控制器、coredns K8S内置的 DNS 服务器、etcd 用于保存集群所有的网络配置和对象的状态信息、pause前面已经提到用于容器间的通讯以及数据卷的挂载。至此K8S安装完成图中的第一个红框的命令是需要管理员手动复制,然后在master服务器上执行的。PS: admin.conf是kubeadm集群管理的核心配置文件,包含整个集群各个节点的授权信息,以及本身的一些配置信息第二个红框中的命令是在node节点上执行,里面包含了一个加入集群的token认证信息以及ca证书的hashcode。通过该token可以加入K8S集群.从图中看到master节点处于NotReady状态,说明节点中存在有问题的Pod,查看存在问题的pod,执行以下命令查看所有Pod状态如果某个Pod的STATUS处于CrashLoopBackOff状态表示创建失败了,那么它会不断自动重新创建。
上图中两个coredns处于pending状态,原因是我们没有配置K8S网络通讯协议fannel,从上传的文件中加载并创建flannel网络组件3.在node节点上执行刚刚由kubeadm生成的节点加入命令如果出现反复无法加入节点的情况,运行 kubeadm reset 这条命令还原当前节点上 kubeadm init 或者 kubeadm join 所做的所有更改。当想加入新节点忘记token时可以使用 kubeadm token list 查看token,或者 kubeadm token create创建token,采用跳过ca安全认证的方式加入节点。4.三台机器设置kubelet开机自启,至此通过kubeadm集群配置完成在主节点上执行以下命令,以下三个配件都是已经配置好的,装载即可。
图中dashboard服务已经被创建,配置文件中关闭了密码验证,只需要浏览器打开 http://192.168.220.131:32000无需登录。
k8s安装部署
K8s集群搭建 1 centos版本信息查看 [root@localhost ~]# uname -a Linux localhost.localdomain 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux k8s集群机器关闭防火墙 [root@localhost ~]# systemctl stop firewalld [root@localhost ~]# systemctl disable firewalld Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. 2 安装必要的包 k8s集群安装以下安装包 [root@k8s-node ~]# yum -y install net-tools wget vim ntpd [root@k8s-node ~]# systemctl enable ntpd [root@k8s-node ~]# systemctl start ntpd 3配置hosts [root@k8s-node ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.248.141 k8s-master 192.168.248.142 k8s-node 4 部署master节点 4.1 Master节点安装必要的安装包 [root@k8s-master ~]# yum -y install etcd 4.2更改/etc/etcd/etcd.conf配置文件 [root@k8s-master etcd]# cat /etc/etcd/etcd.conf | grep -v "^#" ETCD_DATA_DIR="/var/lib/etcd/default.etcd" ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001" ETCD_NAME="master" ETCD_ADVERTISE_CLIENT_URLS= http://k8s-master:2379,http://k8s-master:4001 4.3设置开机启动并验证状态 [root@k8s-master ~]#systemctl enable etcd [root@k8s-master ~]#systemctl start etcd etcd检查 [root@k8s_master ~]# etcdctl -C http://k8s-master:4001 cluster-health member 8e9e05c52164694d is healthy: got healthy result from http://k8s_master:2379 cluster is healthy [root@k8s_master ~]# etcdctl -C http://k8s-master:2379 cluster-health member 8e9e05c52164694d is healthy: got healthy result from http://k8s_master:2379 cluster is healthy 5 安装部署docker环境(略) 6 安装kubernetes [root@k8s_master ~]# yum install kubernetes 安装过程中报错如下 Error: docker-ce conflicts with 2:docker-1.13.1-75.git8633870.el7.centos.x86_64 可以执行如下命令解决 1、查看安装过的docker:yum list installed | grep docker 2、卸载docker:yum remove -y docker-ce.x86_64 0:18.03.0.ce-1.el7.centos 3、删除容器镜像:rm -rf /var/lib/docker 再次安装kubernetes,安装成功,而且会自动安装docker 6.1修改apiserver服务的配置文件 [root@k8s-master kubernetes]# cat /etc/kubernetes/apiserver | grep -v "^#" KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0" KUBE_API_PORT="--port=8080" KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.248.141:2379" KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16" KUBE_ADMISSION_COnTROL="--admission-cOntrol=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota" KUBE_API_ARGS="" 6.2修改config配置文件: [root@k8s-master kubernetes]# cat /etc/kubernetes/config | grep -v "^#" KUBE_LOGTOSTDERR="--logtostderr=true" KUBE_LOG_LEVEL="--v=0" KUBE_ALLOW_PRIV="--allow-privileged=false" KUBE_MASTER="--master=http://192.168.248.141:8080" 设置开机启动,开启服务 [root@k8s-master ~]#systemctl enable kube-apiserver kube-controller-manager kube-scheduler docker [root@k8s-master ~]#systemctl start kube-apiserver kube-controller-manager kube-scheduler docker 6.3查看服务端口: [root@k8s-master ~]# netstat –tnlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1273/master tcp 0 0 127.0.0.1:2380 0.0.0.0:* LISTEN 2126/etcd tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 571/rpcbind tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1362/dnsmasq tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 998/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 996/cupsd tcp6 0 0 ::1:25 :::* LISTEN 1273/master tcp6 0 0 :::4001 :::* LISTEN 2126/etcd tcp6 0 0 :::6443 :::* LISTEN 3216/kube-apiserver tcp6 0 0 :::10251 :::* LISTEN 3222/kube-scheduler tcp6 0 0 :::2379 :::* LISTEN 2126/etcd tcp6 0 0 :::10252 :::* LISTEN 3221/kube-controlle tcp6 0 0 :::111 :::* LISTEN 571/rpcbind tcp6 0 0 :::8080 :::* LISTEN 3216/kube-apiserver tcp6 0 0 :::22 :::* LISTEN 998/sshd tcp6 0 0 ::1:631 :::* LISTEN 996/cupsd 7部署node节点 7.1安装docker(略)安装k8s(略) 7.2 Node节点主机做以下配置: 修改config配置文件 [root@k8s-node kubernetes]# cat /etc/kubernetes/config | grep -v "^#" KUBE_LOGTOSTDERR="--logtostderr=true" KUBE_LOG_LEVEL="--v=0" KUBE_ALLOW_PRIV="--allow-privileged=false" KUBE_MASTER="--master=http://192.168.248.141:8080" 修改kubelet配置文件 [root@k8s-node kubernetes]# cat /etc/kubernetes/kubelet | grep -v "^#" KUBELET_ADDRESS="--address=0.0.0.0" KUBELET_HOSTNAME="--hostname-override=192.168.248.142" KUBELET_API_SERVER="--api-servers=http://192.168.248.141:8080" KUBELET_POD_INFRA_COnTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest" KUBELET_ARGS="" 设置开机启动、开启服务 [root@k8s_client1 ~]# systemctl enable kubelet kube-proxy [root@k8s_client1 ~]# systemctl start kubelet kube-proxy 查看端口: [root@k8s_client1 ~]# netstat –ntlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1277/master tcp 0 0 127.0.0.1:10248 0.0.0.0:* LISTEN 3246/kubelet tcp 0 0 127.0.0.1:10249 0.0.0.0:* LISTEN 3133/kube-proxy tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 575/rpcbind tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1332/dnsmasq tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1000/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 998/cupsd tcp6 0 0 ::1:25 :::* LISTEN 1277/master tcp6 0 0 :::4194 :::* LISTEN 3246/kubelet tcp6 0 0 :::10250 :::* LISTEN 3246/kubelet tcp6 0 0 :::10255 :::* LISTEN 3246/kubelet tcp6 0 0 :::111 :::* LISTEN 575/rpcbind tcp6 0 0 :::22 :::* LISTEN 1000/sshd tcp6 0 0 ::1:631 :::* LISTEN 998/cupsd Master上查看集群中的节点及节点状态 [root@k8s-master kubernetes]# kubectl get node NAME STATUS AGE 192.168.248.142 Ready 2m [root@k8s-master kubernetes]# kubectl -s http://k8s-master:8080 get node NAME STATUS AGE 192.168.248.142 Ready 2m kubernetes集群搭建完成。 在k8s集群中创建pod,如果出现如下错误 其中最主要的问题是:details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory) 解决方案: 查看/etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt (该链接就是上图中的说明) 是一个软链接,但是链接过去后并没有真实的/etc/rhsm,所以需要使用yum安装: yum install *rhsm* 安装完成后,执行一下docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest 如果依然报错,可参考下面的方案: wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem 注释:rpm2cpio命令用于将rpm软件包转换为cpio格式的文件 cpio命令主要是用来建立或者还原备份档的工具程序,cpio命令可以复制文件到归档包中,或者从归档包中复文件。
-i 还原备份档 -v 详细显示指令的执行过程 这两个命令会生成/etc/rhsm/ca/redhat-uep.pem文件. [root@k8s-node ~]# docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest 在master节点新建pod并查看起状态为正常 flannel是CoreOS提供用于解决Dokcer集群跨主机通讯的覆盖网络工具。
它的主要思路是:预先留出一个网段,每个主机使用其中一部分,然后每个容器被分配不同的ip;让所有的容器认为大家在同一个直连的网络,底层通过UDP/VxLAN等进行报文的封装和转发。