Kubernetes,简称K8s,是一个开源的用于管理云平台中多个主机上的容器化的应用,它的目标是让部署容器化的应用简单并且高效(Powerful)。
相关概念
Master
集群控制节点,负责整个集群服务的的管理和控制,运行以下组件:
- kube-apiserver:
http服务,对K8s中所有资源进行管理(增删改查),是集群控制入口 - kubectl:是访问
apiserver的客户端工具 - kube-control-manager:
apiserver为对外开放的应用服务,与之相对的后台服务,负责K8s里所有资源对象的控制 - kube-schedule:资源调度器,负责调度Pod到Node节点上
- etcd:存储各种资源的状态数据
Node
除Master节点外的其他机器节点,是集群的工作负载节点,运行以下组件:
kubelet:负责Pod对应的容器创建、启动、停止、资源监控等任务
kube-proxy:实现Service的通信与负载均衡功能
docker:容器runtimeDeployment
当我们需要创建Pod来运行应用的时候,不是直接创建Pod,而是创建一个Deployment,用它负责创建和更新应用,可以理解为Pod的”管家”。Service
因为K8s机制,Pod会不停的创建和销毁,其IP也会随之变化,想从外部固定访问Pod上运行的应用,就需要Service来暴露Pod里的应用,大致类似于Nginx的反向代理(不是很恰当)
Service定义了一组Pod的逻辑集合和访问策略,无论Pod如何变化,只要Service的访问方式不变,K8s会通过服务注册/发现机制定位到相应的Pod应用Pod
K8s里最小的逻辑运行单元,简单的说就是容器集合;相同Pod里运行的多个容器,共享uts、net、ipc空间等
详情可查看官方文档 - https://kubernetes.io/zh/docs/home/搭建集群
在本地服务器上的Hyper-V创建了 3 台虚拟主机全部安装CentOS 7部署,初始化详见:
Linux(CentOS 7)系统初始化安装 Kubernetes Master
1.安装Kubernetes和etcd
2.编辑yum install -y kubernetes etcd
/etc/etcd/etcd.conf使etcd监听所有的 ip 地址,确保下列行没有注释,并修改为下面的值vi /etc/etcd/etcd.conf
# [member]ETCD_NAME=defaultETCD_DATA_DIR="/var/lib/etcd/default.etcd"ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"#[cluster]ETCD_ADVERTISE_CLIENT_URLS="http://localhost:2379"
3.编辑Kubernetes API server的配置文件,确保下列行没有被注释,并为下列的值
vi /etc/kubernetes/apiserver
#### kubernetes system config## The following values are used to configure the kube-apiserver## The address on the local server to listen to.KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"# The port on the local server to listen on.KUBE_API_PORT="--port=8080"# Port minions listen onKUBELET_PORT="--kubelet_port=10250"# Comma separated list of nodes in the etcd clusterKUBE_ETCD_SERVERS="--etcd_servers=http://127.0.0.1:2379"# Address range to use for servicesKUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"# default admission control policiesKUBE_ADMISSION_CONTROL="--admission_control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"# Add your own!KUBE_API_ARGS=""
4.启动etcd、kube-apiserver、kube-controller-manager和kube-scheduler服务,并设置开机自启
for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler; dosystemctl restart $SERVICESsystemctl enable $SERVICESsystemctl status $SERVICESdone
5.在etcd中定义flannel network的配置,这些配置会被flannel service下发到Node:
etcdctl mk /coreos.com/network/config '{"Network":"172.17.0.0/16"}'
6.添加iptables规则,允许相应的端口
iptables -I INPUT -p tcp --dport 2379 -j ACCEPTiptables -I INPUT -p tcp --dport 10250 -j ACCEPTiptables -I INPUT -p tcp --dport 8080 -j ACCEPTiptables-save
7.查看节点信息(我们还没有配置节点信息,所以这里应该为空)
kubectl get nodesNo resources found.
vi /etc/kubernetes/apiserver
"KUBE_ADMISSION_CONTROL="--admission_control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"#去掉 ServiceAccount,保存退出
重新启动kube-apiserver服务即可
systemctl status -l kubeletsystemctl restart kubelet
安装 Kubernetes Nodes
PS.下面步骤应该在Node上执行(可以添加很多的Node)
1.使用yum安装Kubernetes和flannel
yum install -y flannel kubernetes
2.为flannel service配置etcd服务器
编辑/etc/sysconfig/flanneld文件中的下列行以连接到Master
vi /etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS="http://192.168.1.103:2379"#改为 etcd 服务器的 ip
3.编辑Kubernetes配置文件
编辑/etc/kubernetes/config中Kubernetes的默认配置,确保KUBE_MASTER的值是连接到Kubernetes master API server:
vi /etc/kubernetes/config
KUBE_MASTER="--master=http://192.168.1.103:8080"
4.编辑/etc/kubernetes/kubelet如下行:
vi /etc/kubernetes/kubelet
KUBELET_ADDRESS="--address=0.0.0.0"KUBELET_PORT="--port=10250"KUBELET_HOSTNAME="--hostname_override=192.168.1.104"KUBELET_API_SERVER="--api_servers=http://192.168.1.103:8080"KUBELET_ARGS=""
5.启动kube-proxy、kubelet、docker和flanneld services服务,并设置开机自启
for SERVICES in kube-proxy kubelet docker flanneld; dosystemctl restart $SERVICESsystemctl enable $SERVICESsystemctl status $SERVICESdone
6.在每个Node节点,你应当注意到你有两块新的网卡docker0和flannel0。你应该得到不同的 ip 地址范围在flannel0上,就像下面这样:
node1:ip a | grep flannel | grep inetinet 172.17.29.0/16 scope global flannel0
7.添加iptables规则:
iptables -I INPUT -p tcp --dport 2379 -j ACCEPTiptables -I INPUT -p tcp --dport 10250 -j ACCEPTiptables -I INPUT -p tcp --dport 8080 -j ACCEPTiptables-save
8.现在登陆KubernetesMaster节点验证Node的节点状态:
kubectl get nodesNAME STATUS AGE127.0.0.1 Ready 20m192.168.1.104 Ready 4s
在每个节点上操作好上述步骤后,Kubernetes集群就已经配置并成功运行了,可以继续下面的步骤
👍 公有云集群
各种折腾后(前)公司决定直接花钱上阿里云 ACK 服务 ,搭建简单,去机房维护。
配置集群
Pods (Containers)
为了创建一个Pod,我们需要在KubernetesMaster上面定义一个 yaml 或者 json 配置文件。然后使用 kubectl 命令创建Pod
mkdir -p k8s/podscd k8s/pods/vi nginx.yaml
apiVersion: v1kind: Podmetadata:name: nginxlabels:app: nginxspec:containers:- name: nginximage: nginxports:- containerPort: 80
创建 pod
kubectl create -f nginx.yaml
pod “nginx” created
查看 pod
kubectl get pod nginx
NAME READY STATUS RESTARTS AGE nginx 0/1 ContainerCreating 0 30s
kubectl describe pod nginx
Error syncing pod, skipping: failed to “StartContainer” for “POD” with ErrImagePull: “image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, this may be because there are no credentials on this request. 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是一个软连接
解决方法:
yum install -y *rhsm*#下载并安装 rpm 包wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpmrpm2cpio 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
删除重新创建
kubectl delete pod nginxkubectl create -f nginx.yamlget pod nginx -o widekubectl get pods --all-namespaces
其他环境
Docker
Docker Desktop 可以直接部署一个单点的K8s环境,如下图:
Windows 开启 WSL 并使用 Docker
