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:容器runtime
Deployment
当我们需要创建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=default
ETCD_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 on
KUBELET_PORT="--kubelet_port=10250"
# Comma separated list of nodes in the etcd cluster
KUBE_ETCD_SERVERS="--etcd_servers=http://127.0.0.1:2379"
# Address range to use for services
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
# default admission control policies
KUBE_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; do
systemctl restart $SERVICES
systemctl enable $SERVICES
systemctl status $SERVICES
done
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 ACCEPT
iptables -I INPUT -p tcp --dport 10250 -j ACCEPT
iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
iptables-save
7.查看节点信息(我们还没有配置节点信息,所以这里应该为空)
kubectl get nodes
No resources found.
vi /etc/kubernetes/apiserver
"KUBE_ADMISSION_CONTROL="--admission_control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"
#去掉 ServiceAccount,保存退出
重新启动kube-apiserver
服务即可
systemctl status -l kubelet
systemctl 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; do
systemctl restart $SERVICES
systemctl enable $SERVICES
systemctl status $SERVICES
done
6.在每个Node节点,你应当注意到你有两块新的网卡docker0
和flannel0
。你应该得到不同的 ip 地址范围在flannel0
上,就像下面这样:
node1:
ip a | grep flannel | grep inet
inet 172.17.29.0/16 scope global flannel0
7.添加iptables
规则:
iptables -I INPUT -p tcp --dport 2379 -j ACCEPT
iptables -I INPUT -p tcp --dport 10250 -j ACCEPT
iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
iptables-save
8.现在登陆KubernetesMaster节点验证Node的节点状态:
kubectl get nodes
NAME STATUS AGE
127.0.0.1 Ready 20m
192.168.1.104 Ready 4s
在每个节点上操作好上述步骤后,Kubernetes集群就已经配置并成功运行了,可以继续下面的步骤
👍 公有云集群
各种折腾后(前)公司决定直接花钱上阿里云 ACK 服务 ,搭建简单,去机房维护。
配置集群
Pods (Containers)
为了创建一个Pod,我们需要在KubernetesMaster上面定义一个 yaml 或者 json 配置文件。然后使用 kubectl 命令创建Pod
mkdir -p k8s/pods
cd k8s/pods/
vi nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- 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.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
删除重新创建
kubectl delete pod nginx
kubectl create -f nginx.yaml
get pod nginx -o wide
kubectl get pods --all-namespaces
其他环境
Docker
Docker Desktop 可以直接部署一个单点的K8s环境,如下图:
Windows 开启 WSL 并使用 Docker