k8s简单部署

7-17 343 views

 
这边安装的Kubernetes v1.5.2 比较老的版本,安装新版本请参考上面的手册链接地址

一、k8s相关特点

1:k8s集群的安装
1.1 k8s集群的架构
master节点:etcd,api-server,scheduler,controller-manager
node节点:kubelet,kube-proxy
 
etcd的作用:数据库
api-server:核心服务
controller-manager: 控制器管理 rc
scheduler: 创建新pod,选择合适的节点
kubelet: 调用docker来创建容器
kube-proxy: 对外提供用户访问,对内提供一个负载均衡器
 
1.2 :所有节点配置flannel网络
跨节点容器间的通信 a:安装etcd
b:安装配置启动flannel
c:重启docker生效
 
1.3 :配置master为docker镜像私有仓库
a:速度快
b:保护隐私
 
2:什么是k8s,k8s有什么功能?
2.1 k8s的核心功能
自愈:
弹性伸缩:
服务自动发现和负载均衡
滚动升级和一键回滚
密码和配置文件管理
 
2.2 k8s的历史
2015年 7月份 1.0版
2.3 k8s的安装方式
yum 源码编译 二进制 生产使用 kubeadm 生产使用 minikube
2.4 k8s的应用场景
微服务: 更高的并发,更高的可用性,更快代码更新
缺点: 管理复杂度上升 docker–k8s–弹性伸缩
 
3:k8s常用的资源
 
3.1创建pod资源
k8s最小资源单位 pod资源至少包含两个容器,基础容器pod+业务容器
 
3.2 ReplicationController资源
保证指定数量的pod运行 pod和rc是通过标签来关联 rc滚动升级和一键回滚
 

二、etcd安装

所有节点需要做hosts解析
cat /etc/hosts
192.168.114.3 m1
192.168.114.4 s1
192.168.114.5 s2
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum install etcd -y
# vim /etc/etcd/etcd.conf ……. 6行:ETCD_LISTEN_CLIENT_URLS=”http://0.0.0.0:2379″ 21行:ETCD_ADVERTISE_CLIENT_URLS=”http://192.168.114.3:2379″ …….
#systemctl start etcd.service
#etcdctl -C http://192.168.114.3:2379 cluster-health member 8e9e05c52164694d is healthy: got healthy result from http://192.168.114.3:2379 cluster is healthy
这个只是单点etcd安装,最好做etcd集群,集群方案见我的另一个etcd集群笔记
 

三、master节点安装kubernetes

yum install kubernetes-master.x86_64 -y
# grep -Ev “^#|^$” /etc/kubernetes/apiserver
KUBE_API_ADDRESS=”–insecure-bind-address=0.0.0.0″
KUBE_API_PORT=”–port=8080″
KUBE_ETCD_SERVERS=”–etcd-servers=http://192.168.114.3:2379,http://192.168.114.4:2379,http://192.168.114.5:2379″
KUBE_SERVICE_ADDRESSES=”–service-cluster-ip-range=192.168.114.0/24″
KUBE_ADMISSION_CONTROL=”–admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota”
KUBE_API_ARGS=””
 
# grep -Ev “^#|^$” /etc/kubernetes/config
KUBE_LOGTOSTDERR=”–logtostderr=true”
KUBE_LOG_LEVEL=”–v=0″
KUBE_ALLOW_PRIV=”–allow-privileged=false”
KUBE_MASTER=”–master=http://192.168.114.3:8080″
 
启动kubernetes
systemctl restart kube-apiserver.service
systemctl restart kube-controller-manager.service
systemctl restart kube-scheduler.service
 
检查kubernetes服务是否安装正常
# kubectl get componentstatus
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
etcd-0 Healthy {“health”:”true”}
controller-manager Healthy ok
etcd-2 Healthy {“health”:”true”}
etcd-1 Healthy {“health”:”true”}
 

四、node节点安装kubernetes

curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum install kubernetes-node.x86_64 -y
 
修改配置文件
node1的配置
vim /etc/kubernetes/config …… 22行:KUBE_MASTER=”–master=http://192.168.114.3:8080″ ……
 
# vim /etc/kubernetes/kubelet …… 5行:KUBELET_ADDRESS=”–address=0.0.0.0″ 8行:KUBELET_PORT=”–port=10250″ 11行:KUBELET_HOSTNAME=”–hostname-override=192.168.114.4″ 14行:KUBELET_API_SERVER=”–api-servers=http://192.168.114.3:8080″
 
node2的配置
vim /etc/kubernetes/config …… 22行:KUBE_MASTER=”–master=http://192.168.114.3:8080″ ……
 
# vim /etc/kubernetes/kubelet …… 5行:KUBELET_ADDRESS=”–address=0.0.0.0″ 8行:KUBELET_PORT=”–port=10250″ 11行:KUBELET_HOSTNAME=”–hostname-override=192.168.114.5″ 14行:KUBELET_API_SERVER=”–api-servers=http://192.168.114.3:8080″
 
启动node的kubelet服务
systemctl start kubelet.service
systemctl start kube-proxy.service
 
在master节点检查
# kubectl get nodes
node刚启动会是NotReady状态。过几秒就是Ready了
 

五、所有节点部署flannel网络

flannel的作用就是让pod能通信,也可以说是容器之间的网络通信
工作原理图:
 
开始安装 flannel
### 所有节点安装
yum install flannel -y
sed -i ‘s#http://127.0.0.1:2379#http://192.168.114.3:2379#g’ /etc/sysconfig/flanneld
启动flannel服务
systemctl start flanneld.service
 
 
##master节点操作:
etcd设置网络网段
etcdctl mk /atomic.io/network/config ‘{ “Network”: “172.16.0.0/16” }’
安装docker
yum install docker -y
启动flannel
#systemctl restart flanneld.service
#systemctl restart docker
#systemctl restart kube-apiserver.service
#systemctl restart kube-controller-manager.service
#systemctl restart kube-scheduler.service
 
###所有节点都安装docker并上传docker_busybox.tar.gz
yum install docker -y
rz docker_busybox.tar.gz
docker_busybox.tar.gz这个文件没有怎么办,其实它只是一个基础镜像(busybox是一个集成了一百多个最常用linux命令和工具的软件,他甚至还集成了一个http服务器和一个telnet服务器,而所有这一切功能却只有区区1M左右的大小.我们平时用的那些linux命令就好比是分立式的电子元件,而busybox就好比是一个集成电路,把常用的工具和命令集成压缩在一个可执行文件里,功能基本不变,而大小却小很多倍,在嵌入式linux应用中,busybox有非常广的应用,另外,大多数linux发行版的安装程序中都有busybox的身影,安装linux的时候案ctrl+alt+F2就能得到一个控制台,而这个控制台中的所有命令都是指向busybox的链接.)
可以通过docker pull然后docker save生成这个包的
步骤:
可使用国内的docker镜像下载加速(可选使用)
## curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://bc437cce.m.daocloud.io
#systemctl restart docker
#docker pull busybox
镜像已经下载了,可以将它打成一个gz包
#docker save busybox > busybox.tar.gz 或者docker save busybox:latest -o busybox.tar.gz
使用的时候直接
docker load < httpd_img.tar.gz 或者 docker load -i httpd_img.tar.gz
 
======busybox知识补充完毕+++++下面开始继续
导入镜像到docker
#docker load -i busybox.tar.gz
 
###所有机器都运行docker容器
# docker run -it docker.io/busybox:latest
可以看到三台机器都获取到了flannel分配的网段ip
master
node1
node2
测试网络是否连通,在master节点和node节点互ping
均是通的既可
##node节点:node-1 node-2 [root@node-1 ~]# systemctl restart kubelet.service [root@node-1 ~]# systemctl restart kube-proxy.service ###所有节点启动docker node-1 node-2都部署
Docker从1.13版本开始调整了默认的防火墙规则,禁用了iptables filter表中FOWARD链,这样会引起Kubernetes集群中跨Node的Pod无法通信,在各个Docker节点执行下面的命令: [root@node-1 ~]# vim /usr/lib/systemd/system/docker.service #在[Service]区域下增加一行 …… [Service] ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT …… systemctl daemon-reload systemctl restart docker
 
 

六、配置master为镜像仓库

#所有节点
# cat /etc/docker/daemon.json
{“registry-mirrors”: [“https://registry.docker-cn.com”],
“insecure-registries”: [“192.168.114.3:5000”]
}
# systemctl restart docker
#rz registry.tar.gz 上传registry.tar.gz包。
这个包也是可以通过pull然后打包的,步骤和上面busybox一样
#docker load -i registry.tar.gz
 
#master节点操作
mkdir /opt/myregistry 创建一个目录存放镜像
启动仓库服务
# docker run -d -p 5000:5000 –restart=always –name registry -v /opt/myregistry:/var/lib/registry registry
1e67bdc7634db657a1b2f324ce61003ff8cd17f7988c08142a98471087a2344b
 
查看是否启动成功
 
node节点操作(测试上传镜像到master,我这传输下redis镜像)
# docker tag redis:latest 192.168.114.3:5000/redis:latest
# docker push 192.168.114.3:5000/redis:latest
###在maser节点查看是否有上传的镜像,如下表示私有仓库部署成功:
# ll /opt/myregistry/docker/registry/v2/repositories/
很明显上传成功了
 
客户端查看:
# curl http://192.168.114.3:5000/v2/_catalog
{“repositories”:[“redis”]}
 
客户端下载镜像仓库的镜像:
docker pull 192.168.114.3:5000/redis:latest
 
疑问:为啥docker有了register仓库还出来个harbor仓库?
Q:–harbor提供分层传输机制,优化网络传输
Docker镜像是是分层的,而如果每次传输都使用全量文件(所以用FTP的方式并不适合),显然不经济。必须提供识别分层传输的机制,以层的UUID为标识,确定传输的对象。
 
–harbor提供WEB界面,优化用户体验
只用镜像的名字来进行上传下载显然很不方便,需要有一个用户界面可以支持登陆、搜索功能,包括区分公有、私有镜像。
 
–harbor支持水平扩展集群
当有用户对镜像的上传下载操作集中在某服务器,需要对相应的访问压力作分解。
 

七、配置一个简单pod–nginx

master节点操作:
# mkdir k8s/yaml -p
cd k8s/yaml && vim nginx_pod.yaml
写一个简单的pod-yaml文件
=================pod-yaml知识补充开始=============
pod-yaml文件的一些写法知识补充
apiVersion: v1 # 必选,版本号,例如v1
kind: Pod # 必选,Pod
metadata: # 必选,元数据
name: string # 必选,Pod名称
namespace: string # 必选,Pod所属的命名空间
labels: # 自定义标签
– name: string # 自定义标签名字
annotations: # 自定义注释列表
– name: string
spec: # 必选,Pod中容器的详细定义
containers: # 必选,Pod中容器列表
– name: string # 必选,容器名称
image: string # 必选,容器的镜像名称
imagePullPolicy: [Always | Never | IfNotPresent]# 镜像拉取的策略,默认为Always:Alawys 表示每次都尝试重新拉取镜像;IfNotPresent 表示如果本地有该镜像,则使用本地镜像,本地不存在时拉取镜像;Nerver表示仅使用本地镜像
command: [string] # 容器的启动命令列表,如不指定,使用打包时使用的启动命令
args: [string] # 容器的启动命令参数列表
workingDir: string # 容器的工作目录
volumeMounts: # 挂载到容器内部的存储卷配置
– name: string # 引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
mountPath: string # 存储卷在容器内mount的绝对路径,应少于512字符
readOnly: boolean # 是否为只读模式,默认为读写模式
ports: # 需要暴露的端口库号列表
– name: string # 端口号名称
containerPort: int # 容器需要监听的端口号
hostPort: int # 容器所在主机需要监听的端口号,默认与Container相同。
# 当设置hostPort时,同一台宿主机将无法启动该容器的第二个副本
protocol: string # 端口协议,支持TCP和UDP,默认TCP
env: # 容器运行前需设置的环境变量列表
– name: string # 环境变量名称
value: string # 环境变量的值
resources: # 资源限制和请求的设置
limits: # 资源限制的设置
cpu: string # Cpu的限制,单位为core数,将用于docker run –cpu-shares参数
memory: string # 内存限制,单位可以为Mib/Gib,将用于docker run –memory参数
requests: # 资源请求的设置
cpu: string # Cpu请求,容器启动的初始可用数量
memory: string # 内存清楚,容器启动的初始可用数量
livenessProbe:# 对Pod内个容器健康检查的设置,当探测无响应几次后将自动重启该容器;检查方法有exec、httpGet和tcpSocket,对一个容器只需设置其中一种方法即可
exec: # 对Pod容器内检查方式设置为exec方式
command: [string] # exec方式需要制定的命令或脚本
httpGet: # 对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
path: string
port: number
host: string
scheme: string
HttpHeaders:
– name: string
value: string
tcpSocket: # 对Pod内个容器健康检查方式设置为tcpSocket方式
port: number
initialDelaySeconds: 0 # 容器启动完成后首次探测的时间,单位为秒
timeoutSeconds: 0 # 对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
periodSeconds: 0 # 对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
successThreshold: 0
failureThreshold: 0
securityContext:
privileged: false
restartPolicy: [Always | Never | OnFailure]# Pod的重启策略: Always表示不管以何种方式终止运行,kubelet都将重启;OnFailure表示只有Pod以非0退出码退出才重启; Nerver表示不再重启该Pod
nodeSelector: obeject # 设置NodeSelector表示将该Pod调度到包含这个label的node上,以key:value的格式指定
imagePullSecrets: # Pull镜像时使用的secret名称,以key:secretkey格式指定
– name: string
hostNetwork: false # 是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
volumes: # 在该pod上定义共享存储卷列表
– name: string # 共享存储卷名称 (volumes类型有很多种)
emptyDir: {} # 类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
hostPath: string # 类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
path: string # Pod所在宿主机的目录,将被用于同期中mount的目录
secret: # 类型为secret的存储卷,挂载集群与定义的secre对象到容器内部
scretname: string
items:
– key: string
path: string
configMap: # 类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
name: string
items:
– key: string
path: string
=================pod-yaml知识补充结束,开始写个简单的yaml+++++++
master节点操作的:
vim nginx_pod.yaml
# cat nginx_pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: web
spec:
containers:
– name: nginx
image: 192.168.114.3:5000/nginx:latest
ports:
– name: http
containerPort: 80
hostPort: 6666
 
6666是映射出来的端口号
 
 
#docker pull nginx
#docker tag nginx:latest 192.168.114.3:5000/nginx:latest
#docker push 192.168.114.3:5000/nginx:latest
# kubectl create -f nginx_pod.yaml
Error from server (ServerTimeout): error when creating “nginx_pod.yaml”: No API token found for service account “default”, retry after the token is automatically created and added to the service account
 
创建pod 报错了,根据报错信息可以初步看出是service account没有设置API token引起的。
解决办法:
1.生成一个秘钥:
# openssl genrsa -out /etc/kubernetes/serviceaccount.key 2048
 
2.编辑vim /etc/kubernetes/apiserver
添加以下内容
KUBE_API_ARGS=”–service_account_key_file=/etc/kubernetes/serviceaccount.key”
 
3.编辑/etc/kubernetes/controller-manager
KUBE_CONTROLLER_MANAGER_ARGS=”–service_account_private_key_file=/etc/kubernetes/serviceaccount.key”
 
4.重启服务
systemctl restart etcd kube-apiserver kube-controller-manager kube-scheduler
 
继续创建pod
# kubectl create -f nginx_pod.yaml
# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx 0/1 ContainerCreating 0 39s
# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx 0/1 ContainerCreating 0 54s <none> 192.168.114.5
目前只是pod创建好了,可以看到READY目前是没有一个的。
node节点还没有拉取镜像
 
在Node节点操作:
修改/etc/kubernetes/kubelet
#vim /etc/kubernetes/kubelet
KUBELET_POD_INFRA_CONTAINER=”–pod-infra-container-image=192.168.114.3:5000/pod-infrastructure:latest”
 
重启kubelet
systemctl restart kubelet.service ##node1和node2所有节点都重启
 
还是发现pod没有创建成功。可以通过
# kubectl describe pod nginx 查看相关日志
发现pod-infrastructure:latest这个镜像不存在,那肯定是不存在的,因为我们用的是私有镜像仓库。
解决办法:
在master机器上操作:
1.先通过pull从外网下载pod-infrastructure:latest这个基础镜像
先修改下docker的镜像源地址
vim /etc/docker/daemon.json
# cat /etc/docker/daemon.json
{“registry-mirrors”: [“https://registry.docker-cn.com”]
}
 
重启docker
# systemctl restart docker
# docker search pod-infrastructure
# docker pull docker.io/tianyebj/pod-infrastructure
 
2.上传到私有镜像仓库
取个别名
# docker tag docker.io/tianyebj/pod-infrastructure 192.168.114.3:5000/pod-infrastructure:latest
上传到私有仓库
先修改下/etc/docker/daemon.json
# cat /etc/docker/daemon.json
{“registry-mirrors”: [“https://registry.docker-cn.com”],
“insecure-registries”: [“192.168.114.3:5000”]
}
重启docker
# systemctl restart docker
上传到私有仓库
# docker push 192.168.114.3:5000/pod-infrastructure
The push refers to a repository [192.168.114.3:5000/pod-infrastructure]
ba3d4cbbb261: Pushed
0a081b45cb84: Pushed
df9d2808b9a9: Pushed
latest: digest: sha256:a378b2d7a92231ffb07fdd9dbd2a52c3c439f19c8d675a0d8d9ab74950b15a1b size: 948
3.node节点都重启kubelet
# systemctl restart kubelet.service
 
4.在master机器上检查
发现pod已经启动成功了
 
5.测试访问是否成功
访问正常
 
6.删除pod。
# kubectl delete -f nginx_pod.yaml
pod “nginx” deleted
 
 

八、配置pod更多的信息

为什么创建一个pod资源?K8s需要启动两个容器
pod资源:至少由两个容器组成
pod是k8s最小的资源单位
 
k8s资源的常见操作: (增删改查)
kubectl create -f xxx.yaml (增 )
kubectl get pod|rc #获取、查看资源
kubectl describe pod nginx # 查看资源的具体描述
kubectl delete pod nginx 或者kubectl delete -f xxx.yaml #删除一个资源
kubectl edit pod nginx #改一个资源的配置文件
 
ReplicationController资源 rc
rc:保证指定数量的pod始终存活,并且在任何时候都有指定数量的Pod副本,rc通过标签选择器来关联pod
创建一个简单rc (等同于ReplicationController)
#vim nginx_rc.yml apiVersion: v1 kind: ReplicationController metadata: name: nginx spec: replicas: 5 selector: app: myweb template: metadata: labels: app: myweb spec: containers: – name: myweb image: 192.168.114.3:5000/nginx:latest ports: – containerPort: 80
 
创建
# kubectl create -f nginx_rc.yaml
replicationcontroller “nginx” created
 
查看
# kubectl get rc
NAME DESIRED CURRENT READY AGE
nginx 5 5 5 33s
 
还可以通过get pod查看具体pod资源如何分配的
可以看到5个pod分别部署在2台node上了~
 
#rc的滚动升级
新建一个nginx-rc2.yml
升级
kubectl rolling-update nginx -f nginx-rc2.yml –update-period=10s
回滚
kubectl rolling-update nginx2 -f nginx2-rc.yml –update-period=1s
 
#rc弹性伸缩
弹性伸缩就是在现有环境不能满足业务需求的时候,进行的扩容或缩容
将Nginx-pod缩容成3个
#kubectl scale replicationcontroller nginx –replicas=3
replicationcontroller “nginx” scaled
# kubectl get rc
NAME DESIRED CURRENT READY AGE
nginx 3 3 3 10m
 
再将Nginx-pod扩容成5个
# kubectl scale replicationcontroller nginx –replicas=5
# kubectl get rc
NAME DESIRED CURRENT READY AGE
nginx 5 5 5 11m
 
#删除
# kubectl delete -f nginx_rc.yaml
replicationcontroller “nginx” deleted
 
注意:如你映射了端口出来,你会发现一个node就只能有一个pod。端口是不能重复的
 
只有2个ready好了
 
 
 

为Kubernetes v1.5.2版本安装dashboard图形界面

一、前言 dashboard是一个图形化管理界面,由于我这边的Kubernetes v1.5.2比较老,按官网的安装方法没有效果,现在试试手动安装,使用下面2个yaml文件安装 ...

阅读全文

centos7上openvpn搭建详细教程

写在前面的前言: 因为工作需要安全连接公司的内网机器。对比了几个vpn的配置及工作模式。安全性:openvpn>l2tp/ipsec>pptp ,当然还有ss+代理的模式。...

阅读全文

redis 主从复制及keepalived高可用

前言及思路: 这边的思路是以3作为主,4作为从,110作为VIP漂移地址,应用通过110的6379端口访问redis数据库。 正常运行下,当主节点3宕机后,VIP飘逸到4上,...

阅读全文

欢迎留言