前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >k8s初识

k8s初识

作者头像
丁D
发布2022-08-12 21:31:01
2570
发布2022-08-12 21:31:01
举报
文章被收录于专栏:老铁丁D老铁丁D

Kubernetes

Kubernetes作为容器集群管理工具,具有负载均衡,服务发现等功能。

k8s系统设计图

alt
alt

如上图可以发现: 1.k8s分为masternode节点 2.master运行着组件api serverscheduleretcdcontroller managerkubectl 3.work运行的组件kubeletkube-proxydocker

alt
alt
alt
alt
alt
alt

各个组件的作用

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

alt
alt

核心概念

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就是为进入集群的请求提供路由规则的集合,如下图所示

代码语言:javascript
复制
internet 
| 
[ Ingress ] 
--|-----|-- 
[ Services ] 

深入理解pod

共享volume
配置管理

configMap

生命周期 重启 健康检查

pod的生命周期如下图所示:

alt
alt

重启策略 默认是always always:一定会重启 onFailure:退出码不为0,会重启 never:不重启

pod调度

1.系统内置的调度算法 2.定义pod的时候,使用nodeSelector做定向调度 3.定义pod的使用,使用nodeAffinity做亲和度调度 定向调度:

代码语言:javascript
复制
//1.给对应的node打一个标记使用label 
kubectl label nodes node-name label-key=labelvalue 
//2.配置pod 
nodeSelector: 
zone: north 

亲和度调度:xxx

pod扩容和缩容

在实际工作中我们经常会遇到需要添加或降低服务实例数量。我们可以利用rc的scale机制来处理 ,数量是最终期望的实例数,比如原本有2个则新增2个,原本有5个则减少1个。

代码语言:javascript
复制
kubectl scale rc rc-name --replicas= 

滚动更新

当我们需要更新的时候,我们需要停止所有相关的pod,然后使用rc来创建新的pod(拉起镜像启动),但是停止所有的pod,会导致服务长时间停止提供服务。k8s提供rolling-update来解决问题

alt
alt
代码语言:javascript
复制
kubectl rolling-update old-rc-name -f new-rc-name.yaml 

注意: 1.新旧rc的名字不能相同。 2.selector label至少要有一个不同。 问题 如下旧版rc和新rc 新的多个version label跟旧的不一样。。按道理是要可以的 但实际上会出现

代码语言:javascript
复制
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 

常用命令

代码语言:javascript
复制
//一次性创建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 服务名 

集群的搭建

代码语言:javascript
复制
[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 ~]# 

高可用etcd master

日志收集

k8s+jenkins+docker+gitlab+ansible构建cicd

k8s跟swarm对比

问题:

代码语言:javascript
复制
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 
本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-05-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Kubernetes
    • k8s系统设计图
      • 各个组件的作用
        • 执行流程
          • 核心概念
            • 深入理解pod
              • 常用命令
                • 集群的搭建
                  • 高可用etcd master
                    • 日志收集
                      • k8s+jenkins+docker+gitlab+ansible构建cicd
                        • k8s跟swarm对比
                          • 问题:
                          相关产品与服务
                          容器服务
                          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
                          http://www.vxiaotou.com