Kubernetes作为容器集群管理工具,具有负载均衡,服务发现等功能。
如上图可以发现: 1.k8s分为master和node节点 2.master运行着组件api server,scheduler,etcd,controller manager,kubectl 3.work运行的组件kubelet,kube-proxy,docker
1.etcd运行在master节点上,保存着集群中所有的资源对象(可高可用)。 2.scheduler运行在master,为新建立的Pod进行节点选择(即分配机器),负责集群的资源调度。 3.api server运行在master,提供了资源操作的唯一入口,并提供认证、授权等机制。 4.controller manager运行在master,负责执行各种控制器,controllermanager就会负责管理pod的状态,如,若pod挂了,controllermanager就会重新创建一个一样的pod,或者像扩缩容等。 5.Kubelet运行在work节点,会从api server接收Pod的创建请求,启动和停止容器,监听本节点状态信息并汇报给api server。 6.kube-proxy运行在work节点,提供了负载均衡的功能
用户执行kubectl/userClient向api server发起一个命令,经过认证授权后,经scheduler的各种策略,得到一个目标node,然后告诉api server,api server 会请求相关node的kubelet,通过kubelet把pod运行起来,apiserver还会将pod的信息保存在etcd;pod运行起来后,controllermanager就会负责管理pod的状态,如,若pod挂了,controllermanager就会重新创建一个一样的pod,或者像扩缩容等;pod有一个独立的ip地址,但pod的IP是易变的,如异常重启,或服务升级的时候,IP都会变,这就有了service;完成service工作的具体模块是kube-proxy;在每个node上都会有一个kube-proxy,在任何一个节点上访问一个service的虚拟ip,都可以访问到pod;service的IP可以在集群内部访问到,在集群外呢?service可以把服务端口暴露在当前的node上,外面的请求直接访问到node上的端口就可以访问到service了;
kube-dns实现通过名字来访问到一个pod
Pod pod是k8s最小的调度单元,操作单元,运行着至少一个容器,当只运行一个容器的时候可以直接当作一个应用容器(最常见的用法),一个pod里面的容器之间可以使用localhost来访问。
RC(Replication Controller) ReplicationController(简称RC)是确保用户定义的Pod副本数保持不变。可以跨节点监听pod。 在用户定义范围内,如果pod增多,则ReplicationController会终止额外的pod,如果减少,RC会创建新的pod,始终保持在定义范围
Service Service可以看成一组pod对外的一个访问入口,一个Pod 的逻辑分组,一种可以访问它们的策略 —— 通常称为微服务。 这一组 Pod 能够被 Service 访问到,通常是通过 Label Selector来关联 Label Label是一个key/value,可以看成一个标签,用来标记对象,可以用来关联对象比如 Service通过label来找到对应的pod
replication controller与deployment的区别
Deployment同样为Kubernetes的一个核心内容,主要职责同样是为了保证pod的数量和健康,90%的功能与Replication Controller完全一样,可以看做新一代的Replication Controller。但是,它又具备了Replication Controller之外的新特性:
Replication Controller全部功能:Deployment继承了上面描述的Replication Controller全部功能。
事件和状态查看:可以查看Deployment的升级详细进度和状态。
回滚:当升级pod镜像或者相关参数的时候发现问题,可以使用回滚操作回滚到上一个稳定的版本或者指定的版本。
版本记录: 每一次对Deployment的操作,都能保存下来,给予后续可能的回滚使用。
暂停和启动:对于每一次升级,都能够随时暂停和启动。
Ingress 通常情况下,service和pod的IP仅可在集群内部访问。集群外部的请求需要通过负载均衡转发到service在Node上暴露的NodePort上,然后再由kube-proxy将其转发给相关的Pod。
而Ingress就是为进入集群的请求提供路由规则的集合,如下图所示
internet
|
[ Ingress ]
--|-----|--
[ Services ]
configMap
pod的生命周期如下图所示:
重启策略 默认是always always:一定会重启 onFailure:退出码不为0,会重启 never:不重启
1.系统内置的调度算法 2.定义pod的时候,使用nodeSelector做定向调度 3.定义pod的使用,使用nodeAffinity做亲和度调度 定向调度:
//1.给对应的node打一个标记使用label
kubectl label nodes node-name label-key=labelvalue
//2.配置pod
nodeSelector:
zone: north
亲和度调度:xxx
在实际工作中我们经常会遇到需要添加或降低服务实例数量。我们可以利用rc的scale机制来处理 ,数量是最终期望的实例数,比如原本有2个则新增2个,原本有5个则减少1个。
kubectl scale rc rc-name --replicas=
当我们需要更新的时候,我们需要停止所有相关的pod,然后使用rc来创建新的pod(拉起镜像启动),但是停止所有的pod,会导致服务长时间停止提供服务。k8s提供rolling-update来解决问题
kubectl rolling-update old-rc-name -f new-rc-name.yaml
注意: 1.新旧rc的名字不能相同。 2.selector label至少要有一个不同。 问题 如下旧版rc和新rc 新的多个version label跟旧的不一样。。按道理是要可以的 但实际上会出现
error: mysql-rc-v2.yaml must specify a matching key with non-equal value in Selector for mysql-rc
这个可能是个bug 参考
http://valleylord.github.io/post/201603-kubernetes-roll/
旧rc
selector:
app: mysql-pod
新rc
selector:
app: mysql-pod
version: v2
//一次性创建service和rc
kubectl create -f my-service.yaml -f my-rc.yaml
//根据目录来创建
kubectl create -f dir
//查看pod
kubectl get pods
//查看service rc
kubectl get rc,service
//查看node详情
kubectl describe nodes node-name
//注意容器内应用的日志的生命周期,跟容器的生命周期是一样的。所以容器销毁之后就没了,
//要查看日志可以使用挂载日志或者使用第三方工具:es来收集
//查看容器里面应用程序输出到stdout的日志
kubectl logs pod-name
//相当tail -f pod多个容器要指定容器
kubectl logs -f pod-name -c container-name
查看master etcd controller-manager scheduler是否正常
kubectl get cs
查看pod信息
kubectl get pod
查看资源对象详情
kubectl describe <object>
如 kubectl describe pod podname 查看podname的详情 比如容器一直显示创建中 可以看看为什么
服务日志
journalctl -f -u 服务名
服务状态
systemctl status 服务名
[root@localhost kubernetes]# cat apiserver2
KUBE_ETCD_SERVERS="--etcd-servers=http://127.0.0.1:2379"
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_API_PORT="--insecure-port=0"
KUBE_SECURE_PORT="--secure-port=443"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=169.169.0.0/16"
KUBE_SERVICE_PORT="--service-node-port-range=1-65535"
KUBE_ADM="--admission_control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
KUBE_LOGTOSTDERR="--logtostderr=false"
KUBE_LOG_DIR="--log-dir=/var/log/kubernetes"
KUBE_LOG_LEVEL="--v=2"
CA_FILE="--client-ca-file=/etc/kubernetes/ca.crt"
TLS_PK="--tls-private-key-file=/etc/kubernetes/server.key"
TLS_FILE="--tls-cert-file=/etc/kubernetes/server.crt"
[root@localhost kubernetes]#
====================================
====================================
====================================
[root@localhost kubernetes]# cat /usr/lib/systemd/system/kube-apiserver2.service
[Unit]
Description=kubernetes api server
After=etcd.service
Wants=etcd.service
[Service]
EnvironmentFile=/etc/kubernetes/apiserver2
ExecStart=/usr/bin/kube-apiserver \
${KUBE_LOGTOSTDERR} \
${KUBE_LOG_LEVEL} \
${KUBE_ETCD_SERVERS} \
${KUBE_API_ADDRESS} \
${KUBE_API_PORT} \
${KUBE_SECURE_PORT} \
${KUBE_SERVICE_ADDRESSES} \
${KUBE_SERVICE_PORT} \
${KUBE_LOG_DIR} \
${CA_FILE} \
${TLS_PK} \
${TLS_FILE}
Type=notify
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
[root@localhost kubernetes]# cat controller-manager
KUBE_MASTER="--master=https://192.168.144.3:443"
KUBE_LOGTOSTDERR="--logtostderr=false"
KUBE_LOG_DIR="--log-dir=/var/log/kubernetes"
KUBE_LOG_LEVEL="--v=2"
CLOUD_PROVIDER="--cloud-provider="
KUBE_CONFIG="--kubeconfig=/etc/kubernetes/cs_config"
ROOT_CA_FILE="--root-ca-file=/etc/kubernetes/ca.crt"
SERVER_KEY="--service-account-private-key-file=/etc/kubernetes/server.key"
[root@localhost kubernetes]#
====================================
====================================
====================================
[root@localhost kubernetes]# cat /usr/lib/systemd/system/kube-controller-manager.service
[Unit]
Description=kubernetes controller manager
After=kube-apiserver2.service
Requires=kube-apiserver2.service
[Service]
EnvironmentFile=/etc/kubernetes/controller-manager
ExecStart=/usr/bin/kube-controller-manager \
${KUBE_MASTER} \
${KUBE_LOGTOSTDERR} \
${KUBE_LOG_DIR} \
${KUBE_LOG_LEVEL} \
${KUBE_CONFIG} \
${ROOT_CA_FILE} \
${SERVER_KEY}
Type=notify
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
[root@localhost kubernetes]#
[root@localhost kubernetes]# cat scheduler
KUBE_MASTER="--master=https://192.168.144.3:443"
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_DIR="--log-dir=/var/log/kubernetes"
KUBE_LOG_LEVEL="--v=2"
KUBE_CONFIG="--kubeconfig=/etc/kubernetes/cs_config"
[root@localhost kubernetes]#
====================================
====================================
====================================
[root@localhost kubernetes]# cat /usr/lib/systemd/system/kube-scheduler.service
[Unit]
Description=kubernetes scheduler
After=kube-apiserver2.service
Requires=kube-apiserver2.service
[Service]
EnvironmentFile=/etc/kubernetes/scheduler
ExecStart=/usr/bin/kube-scheduler \
${KUBE_MASTER} \
${KUBE_LOGTOSTDERR} \
${KUBE_LOG_DIR} \
${KUBE_LOG_LEVEL} \
${KUBE_CONFIG}
Type=notify
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
[root@localhost kubernetes]#
====================================
====================================
====================================
[root@localhost kubernetes]# cat cs_config
apiVersion: v1
kind: Config
users:
- name: controllermanager
user:
client-certificate: /etc/kubernetes/cs_client.crt
client-key: /etc/kubernetes/cs_client.key
clusters:
- name: local
cluster:
certificate-authority: /etc/kubernetes/ca.crt
contexts:
- context:
cluster: local
user: controllermanager
name: my-context
current-context: my-context
[root@localhost kubernetes]#
[root@localhost kubernetes]# cat kubelet
HOSTNAME_OVERRIDE="--hostnmae-override=192.168.144.3"
KUBE_LOGTOSTDERR="--logtostderr=false"
KUBE_LOG_DIR="--log-dir=/var/log/kubernetes"
KUBE_LOG_LEVEL="--v=2"
KUBE_FAIL_SWAP="--fail-swap-on=false"
KUBE_CONFIG="--kubeconfig=/etc/kubernetes/node/cs_config"
[root@localhost kubernetes]#
====================================
====================================
====================================
[root@localhost kubernetes]# cat /usr/lib/systemd/system/kubelet.service
[Unit]
Description=kubernetes kubelet
[Service]
WorkingDirectory=/var/lib/kubelet
EnvironmentFile=/etc/kubernetes/kubelet
ExecStart=/usr/bin/kubelet \
${KUBE_LOGTOSTDERR} \
${KUBE_LOG_DIR} \
${KUBE_LOG_LEVEL} \
${KUBE_CONFIG} \
${KUBE_FAIL_SWAP}
Restart=on-failure
[Install]
WantedBy=multi-user.target
[root@localhost kubernetes]#
====================================
====================================
====================================
[root@localhost node]# cat cs_config
apiVersion: v1
kind: Config
users:
- name: kubelet
user:
client-certificate: /etc/kubernetes/node/kubelet_client.crt
client-key: /etc/kubernetes/node/kubelet_client.key
clusters:
- name: local
cluster:
server: https://192.168.144.3:443
certificate-authority: /etc/kubernetes/node/ca.crt
contexts:
- context:
cluster: local
user: kubelet
name: my-context
current-context: my-context
[root@localhost node]#
[root@localhost kubernetes]# cat proxy
MASTER="--master=http://192.168.144.3:8080"
KUBE_LOGTOSTDERR="--logtostderr=false"
KUBE_LOG_DIR="--log-dir=/var/log/kubernetes"
KUBE_LOG_LEVEL="--v=2"
KUBE_CONFIG="--kubeconfig=/etc/kubernetes/node/cs_config"
[root@localhost kubernetes]#
====================================
====================================
====================================
[root@localhost kubernetes]# cat /usr/lib/systemd/system/kube-proxy.service
[Unit]
Description=kubernetes kube-proxy
After=network.target
Requires=network.service
[Service]
EnvironmentFile=/etc/kubernetes/proxy
ExecStart=/usr/bin/kube-proxy \
${MASTER} \
${KUBE_LOGTOSTDERR} \
${KUBE_LOG_DIR} \
${KUBE_LOG_LEVEL} \
${KUBE_CONFIG}
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
[root@localhost kubernetes]#
[root@master ~]# cat mysql-service.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql-sv
namespace: default
labels:
ser_label: mysql-sv
spec:
selector:
app: mysql-pod
type: NodePort
ports:
- port: 3306
targetPort: 3306
nodePort: 33060
[root@master ~]#
[root@master ~]# cat mysql-rc.yaml
---
apiVersion: v1
kind: ReplicationController
metadata:
name: mysql-rc
labels:
app: mysql-rc
spec:
replicas: 1
selector:
app: mysql-pod
template:
metadata:
labels:
app: mysql-pod
spec:
containers:
- name: mysql
image: mysql
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "mysql"
[root@master ~]#
kubelet1.以上--api-server不能用了,要在配置文件中指定server(即apiserver的地址)
controller-manager一直报错集群未设置cloud-provider或设置不当等相关参数,service将返回如下的错误,而service controller并不会进入到实际的工作,最后提示
Failed to start service controller: WARNING: no cloud provider provided, services of type LoadBalancer will fail或 Failed to start service controller: the cloud provider does not support external load balancers。
scheduler失败 不停重启没错误信息
pause镜像 没有翻墙pull不下来
https://blog.csdn.net/qq_24923725/article/details/82910793