k8s简介

kubernetes,简称K8s,是用8代替8个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制

k8s的资源对象

master

kubernetes里的master指的是集群控制节点,在每个kubernetes集群里都需要有一个master来负责真个集群的管理和控制,在master上运行着以下关键进程:

  • API Server(kube-apiserver):提供了HTTP Rest接口的关键服务进程,是kubernetes里所有资源的增删改查等操作的唯一入口,也是集群中的入口进程
  • Controller Manager(kube-controller-manager):kubernetes里所有资源对象的自动化控制中心,可以理解成为资源对象的“大总管”
  • Scheduler:(kube-scheduler):负责资源调度(pod调度)的进程,相当于公交公司的“调度室”
  • Etcd:所有资源对象的数据被会被保存到etcd中,持久化

node

除了master,kubernetes集群中其他机器被称之为 Node,node可以是一台物理机,也可以是一台虚拟机,node是kubernetes集群中的工作负载节点,每个node都会被master分配一些工作负载(docker容器),当某个node宕机时,其他节点会接管故障节点的资源,node节点当中的重要进程:

  • kubelet:负责pod对应容器的创建,启停等任务,另外kubelet与master紧密协作,随时报告给master自身的情况,如CPU,内存,操作系统,docker版本等
  • kube-proxy:实现kubernetes server的通信与负载均衡机制的重要组件
  • docker engine:docker引擎,负责本主机的容器创建 和管理工作

pod

pod是kubernetes最重要的基本概念,是kubernetes调度的最小单元,每个container都有一个pause容器,称之为根容器,属于kubernetes平台的一部分,一个pod可以运行多个容器(container),但是一般来说我们一个pod只运行一个container,如下图:

k8s集群架构图

集群的搭建(master)

简单了解k8s的资源对象之后咱们就先来搭建一个k8s集群,因为我们的后续操作都是建立在k8s集群当中的,因此,我们就需要先搭建一个k8s集群,这样也便于大家的理解

环境准备

三台机器:

  • master:192.168.254.13
  • node1:192.168.254.12
  • node2:192.168.254.10
  • 基于主机名通信:/etc/hosts;
  • 时间同步
  • 关闭firewalld,selinux 

规划如下:

第一步:确保master和node中开启内核参数

echo  > /proc/sys/net/bridge/bridge-nf-call-iptables
note:如果提示没有bridge-nf-call-iptables
解决办法:
[root@localhost ~]# modprobe br_netfilter

第二步:配置docker  yum源和kubenetes  yum源并且安装

#安装kubernetes的yum源
vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name = kubernetes
baseurl = https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled =
gpgcheck =
gpgkey = https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
#安装docker的yum源
cd /etc/yum.repos.d/
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install kubelet kubeadm kubectl docker-ce -y

第三步:添加初始化额外参数,忽略swap报警信息

[root@localhost ~]# vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
[root@localhost ~]# service docker restart

第四步:初始化集群

[root@localhost ~]# kubeadm init --kubernetes-version=v1.15.2 --service-cidr=10.96.0.0/ --pod-network-cidr=10.244.0.0/ --ignore-preflight-errors=Swap --ignore-preflight-errors=NumCPU --image-repository registry.aliyuncs.com/google_containers
解释:
--apiserver-advertise-address:指定用 Master 的哪个IP地址与 Cluster的其他节点通信。
--service-cidr:指定Service网络的范围,即负载均衡VIP使用的IP地址段。
--pod-network-cidr:指定Pod网络的范围,即Pod的IP地址段。
--image-repository:Kubenetes默认Registries地址是 k8s.gcr.io,在国内并不能访问 gcr.io,在1.13版本中我们可以增加-image-repository参数,默认值是 k8s.gcr.io,将其指定为阿里云镜像地址:registry.aliyuncs.com/google_containers。
--kubernetes-version=v1.13.3:指定要安装的版本号。
--ignore-preflight-errors=:忽略运行时的错误,例如上面目前存在[ERROR NumCPU]和[ERROR Swap],忽略这两个报错就是增加--ignore-preflight-errors=NumCPU 和--ignore-preflight-errors=Swap的配置即可。

第五步:记录以下内容,因为后期我们的node节点需要通过ca认证加入到集群当中

kubeadm join 192.168.254.13: --token 71ovlq.w7pf14czrwi7f1ag --discovery-token-ca-cert-hash sha256:d2a9a1aa23fdbcd42711a222c959026073cf0a70f37a87806233d8319c66feb4 

第六步:按照提示完成以下三步

[root@localhost ~]# mkdir -p $HOME/.kube
[root@localhost ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@localhost ~]# chown $(id -u):$(id -g) $HOME/.kube/config

第七步:查看节点状态

这里的NotReady是因为咱们还没有部署网络

[root@localhost ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
localhost.localdomain NotReady master 8h v1.15.2

第八步:查看组件状态

[root@localhost ~]# kubectl get cs
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd- Healthy {"health":"true"}

第九步:部署flannel网络(github)

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

若下载失败可以从阿里云上pull
[root@master1 ~]# docker pull registry.cn-hangzhou.aliyuncs.com/rsq_kubeadm/flannel:v0.11.0-amd64
[root@master1 ~]# docker tag registry.cn-hangzhou.aliyuncs.com/rsq_kubeadm/flannel:v0.11.0-amd64 quay.io/coreos/flannel:v0.11.0-amd64
[root@master1 ~]# docker rmi registry.cn-hangzhou.aliyuncs.com/rsq_kubeadm/flannel:v0.11.0-amd64

集群的搭建(2个node节点)

对于2个node节点的配置跟master节点的1,2,3步一样,这里就不在写了,直接跳到第四步

第四步:节点加入集群,也就是部署master时候的第五步

[root@localhost ~]#kubeadm join 192.168.254.13: --token wug9gq.m9j7hhmvvy9ag8kk --discovery-token-ca-cert-hash sha256:6f8a056391bf04c3911465c581e78376e1d35eb309641105ddd69ce5eb47c591 --ignore-preflight-errors=Swap

第五步:在master节点上用一下命令查看,以下状态是代表ok

[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 10h v1.15.3
node1 Ready <none> 10h v1.15.3
node2 Ready <none> 10h v1.15.3

补充

.如果发现以上错误说明master节点token失效,需要在master上重新生成
[root@localhost ~]# kubeadm token create --print-join-command .如果node机器曾经加入过集群,要重新加入需要kubeadm reset重置,然后在join
[root@localhost ~]# kubeadm reset .如果忘掉token
[root@master ~]# kubeadm token list
.如果忘掉hash串
[root@master]openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der >/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

kubectl命令

kubectl命令是用来在k8s集群当中进行增删改查pod的重要命令,它的常用命令如下:

kubectl get nodes                               #获取节点信息
kubectl get pods -n kube-system #获取kube-system名称空间内的信息
kubectl get pods -n kube-system -o wide #获取kube-system名称空间的详细信息
kubectl get cs #获取component组件的状态
kubectl get ns #获取所有名称空间的状态
kubectl describe node NODENAME #查看节点的详细信息
kubectl cluster-info #集群信息
kubectl delete pod httpd1 #删除所创建的pod
kubectl apply #针对于清单文件创建pod,也可以用这个命令进行更新,他会检查etcd中的数据,把不同地方同步
kubectl patch #打补丁,比如replacas从1修改成5
kubectl rollout undo #回滚
kubectl expose #创建一个service
kubectl scale #扩容或者缩容
kubectl edit #编辑pod或者service清单文件

例子:

1.启动pod,跑nginx服务(在这里的80端口只能被各个pod所访问,集群外的机器无法访问,因为如果pod死掉会重新起一个新pod,但是ip会改变,因此我们在访问服务时不能以pod的ip为准,因此,需要serviceip)
[root@master ~]#kubectl run nginx-deployment --image=nginx:1.14-alpine --port= --replicas=
2.获取pod名称信息,然后映射给service
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-675947b94d-vwcnj / Running 145m
nginx1-7f4f664fbf-c54z6 / Running 145m
3.查看一个pod的标签,在用describe svc SERVICE去查看标签选择器是否一致
[root@master ~]# kubectl get pods --show-labels;
NAME READY STATUS RESTARTS AGE LABELS
nginx-6db489d4b7-bk4sr / Running 71m pod-template-hash=6db489d4b7,run=nginx
nginx-6db489d4b7-gmwsg / Running 74m pod-template-hash=6db489d4b7,run=nginx
4.暴露端口80端口集群网络
[root@master ~]# kubectl expose deployment nginx-deployment --name=nginx --port= --target-port= --protocol=TCP
service/nginx exposed
解释:
--name: 创建的服务名称
--port: service端口
--target-port: pod端口
--protocol: 协议
deployment: 后面跟创建pod的名字
5.查看服务ip,刚才的nginx服务ip就位10.99.108.(这里的ip,也是只能在集群内部各节点中访问,集群外无法访问)
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> /TCP 15h
nginx ClusterIP 10.99.108.60 <none> /TCP 7m1s
6.进入到容器交互界面
kubectl exec -it nginx-56b8c64cb4-t97vb -- /bin/bash #假如当前pod只有一个容器,运行以下命令即可
7.增加原有服务pod数量(动态扩容和缩容)
kubectl scale --replicas= deployment nginx
8.滚动更新
kubectl set image deployment nginx nginx=nginx:1.14-alpine
查看滚动更新状态
kubectl rollout status deployment nginx
如果更新完成之后发现有问题我们还可以做回滚操作
kubectl rollout undo deployment nginx
9.如果想要让集群以外的客户端访问,需要修改pod的service
kubectl edit svc nginx
type: ClusterIP替换成type:NodePort即可

k8s集群搭建(一)的更多相关文章

  1. K8S集群搭建

    K8S集群搭建 摘要 是借鉴网上的几篇文章加上自己的理解整理得到的结果,去掉了一些文章中比较冗余的组件和操作,力争做到部署简单化. K8S组件说明 Kubernetes包含两种节点角色:master节 ...

  2. k8s集群搭建(三)

    Dashboard安装 Kubernetes Dashboard是k8s提供基于Web的监控和操作界面,可以通过UI来显示集群的所有工作负载,除了查看资源,还是创建.编辑.更新.删除资源. 根据Kub ...

  3. k8s集群搭建 2019

    参考,https://github.com/qxl1231/2019-k8s-centos 事实上k8s集群的搭建很简单,笔者在搭建的过程中遇到的主要问题是镜像无法下载的问题. 如果发现教程中提供的镜 ...

  4. K8S集群搭建——基于CentOS 7系统

    环境准备集群数量此次使用3台CentOS 7系列机器,分别为7.3,7.4,7.5 节点名称 节点IPmaster 192.168.0.100node1 192.168.0.101node2 192. ...

  5. 高可用k8s集群搭建

    虚拟机选择 Win10 Hyper-V 总体架构 三个master,三个node master的组件 etcd kube-apiserver kube-controller-manager kube- ...

  6. k8s集群搭建过程详解

    准备工作 安装CentOS7虚拟机 略 安装Docker 略 关闭CentOS7自带的防火墙服务 systemctl disable firewalld systemctl stop firewall ...

  7. Kubernetes 系列(一):本地k8s集群搭建

    我们需要做以下工作: (1)安装VMware,运行CentOs系统,一个做master,一个做node. (2)安装K8s. (3)安装docker和部分镜像会需要访问外网,所以你需要做些网络方面的准 ...

  8. k8s集群搭建笔记(细节有解释哦)

    本文中所有带引号的命令,请手动输入引号,不知道为什么博客里输入引号,总是自动转换成了中文 基本组成 pod:k8s 最小单位,类似docker的容器(也许) 资源清单:资源.资源清单语法.pod生命周 ...

  9. k8s集群搭建EFK日志平台:ElasticSearch + Fluentd + Kibana

    k8s集群 kubectl get node EFK简介 ElasticSearch:分布式存储检索引擎,用来搜索.存储日志 Fluentd:日志采集 Kibana:读取es中数据进行可视化web界面 ...

随机推荐

  1. LeetCode 241. Different Ways to Add Parentheses为运算表达式设计优先级 (C++)

    题目: Given a string of numbers and operators, return all possible results from computing all the diff ...

  2. Java解决方案

    1.新建模板类提示版本太低 Syntax error, type parameters are only available if source level is 1.5 当我的eclipse使用jd ...

  3. [探究] [Luogu4550]收集邮票的概率意义

    自认为这道题是一道比较简单的扩展题--?此处采用了和别的题解思路不同的,纯概率意义上的解法. 首先考虑一个简化版问题: 每次随机一个\([1,n]\)的整数,问期望几次能凑出所有数 这东西我写过一个b ...

  4. [LeetCode] 279. Perfect Squares 完全平方数

    Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 1 ...

  5. javaSript 处理电脑和浏览器pc端缩放对页面的影响

    由于用户的个人习惯或其他原因,可能会调整到电脑上的缩放比例或者浏览器的缩放比例,如果访问页面会看起来比较不好看, 电脑上的缩放: 浏览器上的缩放: 解决方法: function detectZoom( ...

  6. JaCoCo覆盖率计数器

    覆盖率计数器 JaCoCo使用一组不同的计数器来计算覆盖率指标.所有这些计数器都是从Java类文件里获取信息,这些类文件包含Java 字节码指令和调试信息.即使没有可用源代码情况下,这种方法可以实时有 ...

  7. bootstarp treeview 获取勾选和获取Selected选中

    在用treeview的时候,经常会遇到一些官网没有详细说明的东西,比如获取勾选和获取选中的方法,获取选中官网是有明显说明的, 如下 : $('#resourceTree').treeview('get ...

  8. nginx学习笔记2

    nginx基础配置 一.nginx常用命令 nginx -s reload:在nginx已经启动的情况下重新加载配置文件(平滑重启) nginx -s reopen:重新打开日志文件 nginx -c ...

  9. SpringBoot 第一篇:入门篇

    作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/10819728.html 版权声明:本文为博主原创文章,转载请附上博文链接! 前言   博主从去年 ...

  10. 调用其他python脚本文件里面的类和方法

    问题描述: 自己编写了若干个Python脚本. 在testC.py里面需要调用testA.py和testB.py里面的若干类和方法.要怎么办? 需要都打包.安装,再去调用吗? 其实不必那么麻烦. 这里 ...