一、简介:
Kubernetes是一个可移植的,可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声
明式配置和自动化。它拥有一个庞大且快速增长的生态系统。Kubernetes的服务,支持和工具广
泛可用。
Kubernetes这个名字起源于希腊语,意思是舵手或飞行员。Google在2014年开源了
Kubernetes项目。Kubernetes建立在Google大规模运行生产工作负载的十年半的经验的基础
上,并结合了社区中最好的想法和实践
官网链接:https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/
怎么使用:
-**Build , Ship and Run (创建,发送和运行)
-**Build once,Run anywhere (搭建一次,到处能用)
-Docker技术的核心概念:
1.镜像(Image)
2.容器(Container)
3.仓库(Repository)
kubernetes的架构
一个k8s系统,通常称为一个k8s集群(cluster)
这个集群主要包括两个部分:
一个是master节点(主节点)
Master节点包括API Server、Scheduler、Controller manager、etcd。
API Server是整个系统的对外接口,提供客户端和其它组件调用,相当于“营业厅”。
Scheduler 负责对集群内部的资源进行调度,相当于“调度室”。
Controller manager负责管理控制器,相当于“大总管”。
一群Node节点(计算节点)
-Node节点包括**Docker、kubelet、kube-proxy、Fluentd、kube-dns(可选),还有就是Pod。
Pod是kubernetes最基本的操作单元。
一个Pod代表着集群中运行的一个进程,它内部封装了一个或多个紧密相关的容器。
除了Pod之外,k8s还有一个Service,一个Service可以看作一组提供相同服务的Pod的对外访问接口
Docker:不用说了,创建容器的。
Kubelet:主要负责监视指派到它在Node上的Pod,包括创建、修改、监控、删除等。
Kuber-proxy,主要负责为Pod对象对象提供代理。
Fluentd,主要负责日志收集、存储与查询。
#############################################################################
二、环境介绍:
华为云:master节点 IP地址:192.168.0.20
nova1 192.168.0.21nova2 192.168.0.22
registry[私有仓库] 192.168.0.23
三、kubernetes的配置:
1.设置ip和主机名
/etc/hosts //如果你内外又属于自己的dns那就不需要做这一步
2.开启路由转发功能
net.ipv4.ip_forward=1
3.配置yum源
这里使用的是华为云提供的yum源
4.配置私有仓库registry [注:私有镜像仓库也可以在master管理节点上配置]
[root@registry ~]# yum -y install docker-distribution.x86_64 //直接使用华为云提供的docker仓库包
[root@registry ~]# yum -y install docker
注意:由于使用的是华为云上的docker仓库,由于版本不一致导致/etc/sysconfig/docker/里面少了私有仓库
的选项我们需要手动加进去–add-registry=”192.168.0.23:5000″ —
insecure-registry=”192.168.0.23:5000″
[root@registry docker]# vim /etc/sysconfig/docker
4 OPTIONS=’–selinux-enabled –log-driver=journald –signature-verification=false –add-regis
try=”192.168.0.23:5000″ –insecure-registry=”192.168.0.23:5000″ ‘
启动服务
[root@registry ~]# systemctl start docker-distribution
[root@registry ~]# systemctl enable docker-distribution
[root@registry ~]# systemctl start docker
[root@registry ~]# systemctl enable docker
打标记把需要的镜像上传仓库:
[root@registry docker]# docker tag docker.io/centos:latest 192.168.0.23:5000/docker.io/centos:latest
[root@registry docker]# docker push 192.168.0.23:5000/docker.io/centos:latest
[root@registry docker]# docker tag kubernetes-dashboard-amd64:v1.8.3
192.168.0.23:5000/kubernetes-dashboard-amd64:v1.8.3
[root@registry docker]# docker push 192.168.0.23:5000/kubernetes-dashboard-amd64:v1.8.3
[root@registry docker]# docker tag pod-infrastructure:latest 192.168.0.23:5000/pod-
infrastructure:latest
[root@registry docker]# docker push 192.168.0.23:5000/pod-infrastructure:latest
镜像上传私有仓库完后可以验证一下:
curl http://192.168.0.23:5000/v2/_catalog
{“repositories”:[“docker.io/centos”,”kubernetes-dashboard-amd64″,”pod-infrastructure”]} //能看到
上传的包就代表成功了然后分别在:manster、nova1、nova2等机器上操作
[root@ecs-master ~]# yum -y install docker
[root@ecs-master ~]# scp root@192.168.0.23:/etc/sysconfig/docker /etc/sysconfig/docker
[root@ecs-master ~]# curl http://192.168.0.23:5000/v2/_catalog
{“repositories”:[“docker.io/centos”,”kubernetes-dashboard-amd64″,”pod-infrastructure”]}
5、配置kubernets –master上操作
5.1需要这六个软件包:
[root@ecs-master kubernetes]# ls
containernetworking-cni-0.6.0-3.el7.x86_64.rpm kubernetes-kubeadm-1.10.3-0.el7.x86_64.rpm
etcd-3.3.11-2.el7.centos.x86_64.rpm kubernetes-master-1.10.3-0.el7.x86_64.rpm
flannel-0.7.1-4.el7.x86_64.rpm kubernetes-node-1.10.3-0.el7.x86_64.rpm
kubernetes-1.10.3-0.el7.x86_64.rpm repodata
kubernetes-client-1.10.3-0.el7.x86_64.rpm
5.2自己共享yum源:
[root@ecs-master kubernetes]# createrepo .
5.3分别在三台机器都配置yum源
5.4在master上安装以下的包
package:
1、etcd
2、kubernetes-master
3、kubernetes-client
[root@ecs-master kubernetes]# yum -y install kubernetes-master etcd kubernetes-client
5.5需要启动的服务
service:
1、kube-apiserver
2、kube-controller-manager
3、kube-scheduler
4、etcd //是一款nosql数据库
需要修改的配置文件:
第一个文件是etcd服务的配置文件:[root@ecs-master kubernetes]# vim /etc/etcd/etcd.conf
6 ETCD_LISTEN_CLIENT_URLS=”http://192.168.0.20:2379″ //etcd服务监听的地址(etcd需要监听
mastar的地址)
第二个文件是kubeconfig的配置文件:[root@ecs-master kubernetes]# vim /etc/kubernetes/config
22 KUBE_MASTER=”–master=http://192.168.0.20:8080″ //配置kuber-master的ip地址
第三个文件:[root@ecs-master kubernetes]# vim /etc/kubernetes/apiserver
8 KUBE_API_ADDRESS=”–insecure-bind-address=0.0.0.0″ //监听访问的地址
17 KUBE_ETCD_SERVERS=”–etcd-servers=http://127.0.0.1:2379,http://192.168.0.20:2379″ //监听etcd
所在的IP地址
23 删除ServiceAccount 参数 //这个是证书的认证参数
第四个文件:/etc/kubernetes/controller-manager
第五个文件:/etc/kubernetes/scheduler启动服务:[root@ecs-master kubernetes]# systemctl restart kube-apiserver kube-controller-manager
kube-scheduler etcd
验证:
kubectl get cs //kubectl主要是控制k8s的命令,验证服务的状态
kubectl get csr
kubectl get node
[root@ecs-master kubernetes]# kubectl get cs
NAME STATUS MESSAGE ERROR
etcd-0 Unhealthy Get http://127.0.0.1:2379/health: dial tcp 127.0.0.1:2379: getsockopt:
connection refused
etcd-1 Unhealthy Get http://192.168.0.20:4001/health: dial tcp 192.168.0.20:4001:
getsockopt: connection refused
scheduler Healthy ok
controller-manager Healthy ok
6.配置nova节点(所有nova节点都需要配置)
需要的安装包:
1、kubernetes-node
2、docker
[root@nova2 ~]# yum -y install kubernetes-node docker
需要启动的服务:
1、kubelet
2、kube-proxy
3、docker
需要配置的配置文件:
1、/etc/sysconfig/docker
4 添加参数 –add-registry=”192.168.0.23:5000″ –insecure-registry=”192.168.0.23:5000″
2、/etc/kubernetes/config
22 KUBE_MASTER=”–master=http://192.168.0.20:8080″
3、/etc/kubernetes/kubelet
5 KUBELET_ADDRESS=”–address=0.0.0.0″ //kubelet监听的地址,网络监听
11 KUBELET_HOSTNAME=”–hostname-override=nova2″ //本机主机名
14添加参数: KUBELET_ARGS=”–cgroup-driver=systemd –fail-swap-on=false —
kubeconfig=/etc/kubern etes/kubelet.kubeconfig –pod-infra-container-image=pod-
infrastructure:latest” //上传镜像的参数
/etc/kubernetes/kubelet.kubeconfig //yaml文件
apiVersion: v1
kind: Configclusters:
– cluster:
server: http://192.168.0.20:8080 //master主机的IP
name: local
contexts:
– context:
cluster: local
name: local
current-context: local
[root@nova2 ~]# systemctl start kubelet kube-proxy docker //启动服务
[root@nova2 ~]# systemctl status kubelet kube-proxy docker //检查三个服务必须启动
在master上验证:
[root@ecs-master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
nova1 Ready <none> 15h v1.10.3
nova2 Ready <none> 1m v1.10.3
7.配置网络
master:
[root@ecs-master docker]# vim /etc/etcd/etcd.conf //配置数据库监听地址
6 ETCD_LISTEN_CLIENT_URLS=”http://0.0.0.0:2379″ //改成让监听所有地址
[root@ecs-master docker]# systemctl restart etcd.service
[root@ecs-master docker]# etcdctl mk /atomic.io/network/config
‘{“Network”:”10.254.0.0/16″,”Backend”:{“Type”:”vxlan”}}’ //给数据库添加网络字段给nova机器分
网段 ,此命令只能执行一次
{“Network”:”10.254.0.0/16″,”Backend”:{“Type”:”vxlan”}}
[root@ecs-master docker]# etcdctl get /atomic.io/network/config //验证查看
{“Network”:”10.254.0.0/16″,”Backend”:{“Type”:”vxlan”}}
maste和nova主机:
package:flannel
[root@ecs-master docker]# yum -y install flannel
配置文件:/etc/sysconfig/flanneld
4 FLANNEL_ETCD_ENDPOINTS=”http://192.168.0.20:2379″
[root@ecs-master docker]# systemctl stop docker
[root@ecs-master docker]# systemctl start flanneld //注:这里需要注意的是启动flanneld前
docker需要关闭,必须先起flanneld再起docker
[root@ecs-master docker]# systemctl start docker验证:
[root@nova2 ~]# docker run -it 192.168.0.23:5000/docker.io/centos:latest //创建一个容器
必须要互相能ping通这个容器
8创建容器,测试
[root@ecs-master docker]# kubectl create -f baseos.yaml
deployment.extensions “test-os” created
[root@ecs-master docker]# kubectl get pod //查看已经启动的容器
NAME READY STATUS RESTARTS AGE
test-os-787b55d7cd-bfnk5 1/1 Running 0 1m
test-os-787b55d7cd-hzx4j 1/1 Running 0 1m
[root@ecs-master docker]# kubectl delete -f baseos.yaml //删除创建的容器
[root@ecs-master docker]# kubectl exec -it test-os-787b55d7cd-2rqwd — /bin/bash //进入创建的容
器
[root@ecs-master docker]# kubectl get pod -o wide //可以查看到容器的详细信息
NAME READY STATUS RESTARTS AGE IP NODE
test-os-787b55d7cd-2rqwd 1/1 Running 0 8m 10.254.86.2 nova1
test-os-787b55d7cd-lfjcj 1/1 Running 0 8m 10.254.51.2 nova
[root@ecs-master docker]# cat baseos.yaml //启动容器的yaml文件
—
apiVersion: extensions/v1beta1 #当前格式的版本
kind: Deployment #当前创建资源的类型, 当前类型是Deployment
metadata: #当前资源的元数据
name: test-os #当前资源的名字 是元数据必须的项
spec: #是当前Deployment的规格说明
replicas: 1 #指当前创建的副本数量 默认不填 默认值就为‘1’
template: #定义pod的模板
metadata: #当前pod的元数据
labels: #至少顶一个labels标签,可任意创建一个 key:value
app: test_os
spec: #当前pod的规格说明
containers: #容器
– name: centos #是容器的名字容器名字是必须填写的
image: 192.168.0.23:5000/docker.io/centos:latest #镜像 镜像的名字和版本
stdin: true
tty: true
########################################################################启动kube-dashboard
[root@ecs-master docker]# kubectl create -f kube-dashboard.yaml
[root@ecs-master docker]# kubectl -n kube-system get pod -o wide //查看启动的kube-
dashboard服务
NAME READY STATUS RESTARTS AGE IP NODE
kubernetes-dashboard-8658d8bdf8-gctjq 1/1 ImagePullBackOff 0 4m 10.254.51.3
nova2
[root@ecs-master docker]# cat kube-dashboard.yaml //启动一个web页面管理的文件
kind: Deployment
apiVersion: apps/v1beta2
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
k8s-app: kubernetes-dashboard
template:
metadata:
labels:
k8s-app: kubernetes-dashboard
spec:
containers:
– name: kubernetes-dashboard
image: 192.168.0.23:5000/kubernetes-dashboard-amd64:v1.8.3
ports:
– containerPort: 9090
protocol: TCP
args:
– –apiserver-host=http://192.168.0.20:8080 ###修改为Master的IP
volumeMounts:
– mountPath: /tmp
name: tmp-volume
livenessProbe:
httpGet:
path: /
port: 9090initialDelaySeconds: 30
timeoutSeconds: 30
volumes:
– name: tmp-volume
emptyDir: {}
serviceAccountName: kubernetes-dashboard
# Comment the following tolerations if Dashboard must not be deployed on master
tolerations:
– key: node-role.kubernetes.io/master
effect: NoSchedule
—
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
type: NodePort
ports:
– port: 80
targetPort: 9090
nodePort: 30090
selector:
k8s-app: kubernetes-dashboard
在nova上验证:
[root@nova1 ~]# ss -nutlp | grep 30090
tcp LISTEN 0 1024 :::30090 ((“kube-proxy”,pid=9169,fd=6))
[root@nova2 ~]# ss -nutlp | grep 30090
tcp LISTEN 0 1024 :::30090 ((“kube-proxy”,pid=9169,fd=6))
由于需要从外网访问先给nova绑定一个公网IP地址,然后使用浏览器进行访问http//ip地址:30090到此为止kubernetes的部署已经完成。
想要了解怎么管理尽请期待。。。。。。。