修订记录
概念篇
1、云原生和微服务
云计算包含的内容十分繁杂,也有很多技术和公司牵强附会说自己是云计算公司,说自己是做云的,实际上可能风马牛不相及。说白了,云计算就是一种配置资源的方式,根据资源配置方式的不同我们可以把云计算从宏观上分为以下三种类型:
- IaaS:基础设施即服务,通过虚拟化和分布式存储等技术,实现了对包括服务器、存储设备、网络设备等各种物理资源的抽象,从而形成了一个可扩展、可按需分配的虚拟资源池。例如亚马逊的EC2、S3存储、Rackspace虚拟机、阿里云ECS等都是IaaS。
- PaaS:平台即服务,工具和服务的集合,为开发者提供了应用的开发环境和运行环境,将开发者从繁琐的IT环境管理中解放出来,比如Cloud Foundry、Google App Engine、Heroku等。
- SaaS:软件即服务,终端用户可以直接使用的应用程序。这个就太多,我们生活中用到的很多软件都是SaaS服务,只要基于互联网来提供的服务基本都是SaaS服务,有的服务是免费的,比如Google Docs,还有更多的是根据我们购买的Plan和使用量付费,比如GitHub、各种云存储。
简而言之,SaaS通过网络运行,为最终用户提供应用服务;PaaS是一套工具服务,为编码和部署应用程序提供快速、高效的服务;IaaS包括硬件和软件,例如服务器、存储、网络和操作系统。
1.1 云原生
2015年谷歌成立了原生云计算基金会(CNCF),目前基金会成员包含Box、华为、思科、Docker、eBay、IBM、英特尔、红帽、Twitter、VMware、三星等70多家成员。
CNCF认为CloudNative系统需包含的属性:
- 容器化封装:以容器为基础,提高整体开发水平,形成代码和组件重用,简化云原生应用程序的维护。在容器中运行应用程序和进程,并作为应用程序部署的独立单元,实现高水平资源隔离。
- 自动化管理:统一调度和管理中心,从根本上提高系统和资源利用率,同时降低运维成本。
- 面向微服务:通过松耦合方式,提升应用程序的整体敏捷性和可维护性。

自从云的概念开始普及,许多公司都部署了实施云化的策略,纷纷搭建起云平台,希望完成传统应用到云端的迁移。但是这个过程中会遇到一些技术难题,上云以后,效率并没有变得奇高,故障也没有迅速定位。
为了解决传统应用升级缓慢、架构臃肿、不能快速迭代、故障不能快速定位、问题无法快速解决等问题,云原生这一概念横空出世。云原生可以改进应用开发的效率,改变企业的组织结构,甚至会在文化层面上直接影响一个公司的决策。
另外,云原生也很好地解释了云上运行的应用应该具备什么样的架构特性——敏捷性、可扩展性、故障可恢复性。
综上所述,云原生应用应该具备以下几个关键词:
- 敏捷
- 可靠
- 高弹性
- 易扩展
- 故障隔离保护
- 不中断业务持续更新
以上特性也是云原生区别于传统云应用的优势特点。
从宏观概念上讲,云原生是不同思想的集合,集目前各种热门技术之大成。
1.2 微服务
服务是一种分布式架构设计理念,为了推动细粒度服务的使用,这些服务要能协同工作,每个服务都有自己的生命周期。一个微服务就是一个独立的实体,可以独立的部署在PAAS平台上,也可以作为一个独立的进程在主机中运行。服务之间通过API访问,修改一个服务不会影响其它服务。
2、Kubernetes简介
Kubernetes(K8S,为什么叫K8S,即k8个字母s)是谷歌开源的容器集群管理系统,是谷歌多年大规模容器管理技术Borg的开源版本,主要功能包括:
- 基于容器的应用部署、维护和滚动升级;
- 负载均衡和服务发现;
- 跨机器和跨地区的集群调度;
- 自动伸缩;
- 无状态服务和有状态服务;
- 广泛的Volume支持;
- 插件机制保证扩展性;
2.1 Borg简介
Borg是谷歌内部的大规模集群管理系统,负责对谷歌内部很多核心服务的调度和管理。Borg的目的是让用户能够不必操心资源管理的问题,让他们专注于自己的核心业务,并且做到跨多个数据中心的资源利用率最大化。
Borg主要由BorgMaster、Borglet、borgcfg和Scheduler组成,如下图所示:
- BorgMaster是整个集群的大脑,负责维护整个集群的状态,并将数据持久化到Paxos存储中;
- Scheduer负责任务的调度,根据应用的特点将其调度到具体的机器上去;
- Borglet负责真正运行任务(在容器中);
- borgcfg是Borg的命令行工具,用于跟Borg系统交互,一般通过一个配置文件来提交任务。
2.2 K8S架构
Kubernetes借鉴了Borg的设计理念,比如Pod、Service、Labels和单Pod单IP等。Kubernetes的整体架构跟Borg非常像,如下图所示
k8s主要由以下几个核心组件组成:
- etcd:保存了整个集群的状态;
- apiserver:提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
- controller manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
- scheduler:负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;
- kubelet:负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;
- Container runtime:负责镜像管理以及Pod和容器的真正运行(CRI);
- kube-proxy:负责为Service提供cluster内部的服务发现和负载均衡,默认使用iptables做转发,可以修改为ipvs(目前1.9版本支持);
- kube-dns:负责为整个集群提供DNS服务;
- Ingress Controller:为服务提供外网入口;
- Heapster:提供资源监控;
- Dashboard:提供GUI;
- Federation:提供跨可用区的集群;
- kube-router:功能类似kube-router,可以代替kube-proxy,默认使用ipvs做service负载均衡;
http://www.k8smeetup.com/article/NyQFBDMHN
3、Kubernetes命令
Command line tool (kubectl) | Kubernetes
集群部署篇
在线部署方式参考:使用kubeadm安装Kubernetes 1.8版本_Kubernetes中文社区
由于国内GFW的关系,在国内在线部署K8S比较困难,so需要一点套路来解决。
1、环境
主机名 | 外网IP | 内网IP | 系统 |
---|
k8s-master | 192.168.110.75 | 172.16.2.55 | CentOS 7.4.1708 |
k8s-node-01 | 192.168.110.76 | 172.16.2.56 | CentOS 7.4.1708 |
k8s-node-02 | 192.168.110.77 | 172.16.2.57 | CentOS 7.4.1708 |
注:已关闭防火墙和selinux。
1 2 3 | echo "192.168.110.76 k8s-node-01" >> /etc/hosts echo "192.168.110.75 k8s-master" >> /etc/hosts echo "192.168.110.77 k8s-node-02" >> /etc/hosts |
1.1 dockr安装
Kubernetes 1.9.0已经针对docker17.03.2版本做了验证。 因为我们这里在各节点安装docker的17.03.2版本。
在电脑上下载好docker安装包,docker1.17.03下载地址: https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-17.03.2.ce-1.el7.centos.x86_64.rpm https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpm
上传到所有节点,并执行:
1 2 | yum -y localinstall dock* systemctl enable docker.service |
若出现以下错误:
1 2 3 | Error: docker-ce-selinux conflicts with 2:container-selinux-2.33-1.git86f33cd.el7.noarch You could try using --skip-broken to work around the problem You could try running: rpm -Va --nofiles –nodigest |
【解决】
1 | rpm -e container-selinux-2.33-1.git86f33cd.el7.noarch |
1.2 关闭swap
Kubernetes 1.8开始要求关闭系统的swap,如果不关闭,默认配置下kubelet将无法启动。阿里云ECS默认是关闭swap的,所以这步骤可以不执行。
1.3 安装ebtables socat依赖包
修改 /etc/fstab 文件,注释掉 SWAP 的自动挂载,使用free -m确认swap已经关闭。
1 | yum install -y ebtables socat |
1.4 修改iptables规则
Docker从1.13版本开始调整了默认的防火墙规则,禁用了iptables filter表中FOWARD链,这样会引起Kubernetes集群中跨Node的Pod无法通信,在各个Docker节点执行下面的命令:
1 | iptables -P FORWARD ACCEPT |
1.5 关闭firewalld
为了在部署的时候避免一些不必要的麻烦,先关闭firewalld:
1 2 | systemctl stop firewalld systemctl disable firewalld |
2、安装K8S
所有离线安装包和yaml文件均放在阿里云nfs的images目录下。
2.1 安装kubelet kubeadm kubectl
上传离线包至k8s目录下,并解压:
1 2 3 | mkdir /opt/k8s cd /opt/k8s tar zxvf k8s1.9.0.rpm. tar .gz |
安装:
1 | yum -y localinstall kub* |
2.2 修改各节点docker的配置文件
exec-opts:安装kubelet,kubeadm时生成10-kubeadm.conf文件中将这个参数值为systemd,而docker 17.03使用的Cgroup Driver为cgroupfs, 修改各节点docker的cgroup driver使其一致;
registry-mirrors:阿里云镜像加速;
insecure-registry:本地私有仓库,若不加这个参数,会导致无法登陆私有仓库;
graph:docker镜像和容器默认存储目录,由于镜像文件数量多,文件也不小,默认是放在/var/lib/docker,很快系统盘就会耗尽,所以需要修改该目录,挂在数据盘上。
1 | mkdir /etc/dockercat <<EOF> /etc/docker/daemon .json { "exec-opts" : [ "native.cgroupdriver=systemd" ], "registry-mirrors" : [ "https://cn5owbch.mirror.aliyuncs.com" ], "insecure-registry" : [ "172.16.2.55" ], "graph" : "/alidata/docker" } EOF |
修改/usr/lib/systemd/system/docker.service中的ExecStart:
1 | ExecStart= /usr/bin/dockerd --insecure-registry 172.16.2.55 |
注:--insecure-registry 172.16.2.55参数用于登录私有仓库。
重启docker:
1 2 3 | systemctl daemon-reload systemctl restart docker systemctl status docker |
2.3 启动 kubelet
在各节点启动 kubelet:
1 | systemctl enable kubelet && systemctl start kubelet |
2.4 导入相关镜像
2.4.1 master
1 2 3 | mkdir -p /opt/master/ cd /opt/master tar zxvf k8s1. 9.0 -images-master.tar.gz |
导入镜像:
1 2 3 4 5 6 7 8 9 10 11 12 | cd images docker load<coredns. tar .gz docker load<etcd-amd64. tar .gz docker load<flannel. tar .gz docker load<k8s-dns-dnsmasq-nanny-amd64. tar .gz docker load< k8s-dns-kube-dns-amd64. tar .gz docker load< k8s-dns-sidecar-amd64. tar .gz docker load<kube-apiserver-amd64. tar .gz docker load<kube-controller-manager-amd64. tar .gz docker load<kube-proxy-amd64. tar .gz docker load<kube-scheduler-amd64. tar .gz docker load<pause-amd64. tar .gz |
查看导入的镜像:
1 2 3 4 5 6 | [root@iZbp15th6fsxatrsfbay9iZ images] # docker images REPOSITORY TAG IMAGE ID CREATED SIZE gcr.io /google_containers/kube-proxy-amd64 v1.9.0 f6f363e6e98e 3 days ago 109 MB gcr.io /google_containers/kube-apiserver-amd64 v1.9.0 7bff5aa286d7 3 days ago 210 MB gcr.io /google_containers/kube-controller-manager-amd64 v1.9.0 3bb172f9452c 3 days ago 138 MB gcr.io /google_containers/kube-scheduler-amd64 v1.9.0 5ceb21996307 3 days ago 62.7 MB |
2.4.2 node
1 2 3 | mkdir -p /opt/node cd /opt/node tar zxvf k8s1.9.0-images-node. tar .gz |
导入镜像:
1 2 3 4 5 6 7 8 9 | cd images docker load<busyboxplus. tar .gz docker load<flannel. tar .gz docker load<heapster-amd64. tar .gz docker load<heapster-grafana-amd64. tar .gz docker load<heapster-influxdb-amd64. tar .gz docker load<kube-proxy-amd64. tar .gz docker load<kubernetes-dashboard-amd64. tar .gz docker load<pause-amd64. tar .gz |
查看导入镜像:
1 2 3 4 5 6 7 8 9 10 11 12 | [root@iZbp1ea5ui64fv6qohw86wZ images] # docker images REPOSITORY TAG IMAGE ID CREATED SIZE gcr.io /google_containers/kube-proxy-amd64 v1.9.0 f6f363e6e98e 3 days ago 109 MB gcr.io /google_containers/kubernetes-dashboard-amd64 v1.8.1 e94d2f21bc0c 3 days ago 121 MB quay.io /coreos/flannel v0.9.1-amd64 2b736d06ca4c 4 weeks ago 51.3 MB gcr.io /google_containers/heapster-influxdb-amd64 v1.3.3 577260d221db 3 months ago 12.5 MB gcr.io /google_containers/heapster-grafana-amd64 v4.4.3 8cb3de219af7 3 months ago 152 MB gcr.io /google_containers/heapster-amd64 v1.4.2 d4e02f5922ca 3 months ago 73.4 MB registry.cn-hangzhou.aliyuncs.com /sunyuki/pod-infrastructure latest f66f4bd9b894 6 months ago 206 MB registry.cn-hangzhou.aliyuncs.com /google-containers/kubernetes-dashboard-amd64 v1.5.0 e5133bac8024 12 months ago 88.9 MB gcr.io /google_containers/pause-amd64 3.0 99e59f495ffa 19 months ago 747 kB radial /busyboxplus curl 71fa7369f437 3 years ago 4.21 MB |
2.5 Master节点初始化集群
1 2 3 4 5 6 | cat <<EOF> /etc/sysctl .d /k8s .conf net.ipv4.ip_forward=1 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl -p /etc/sysctl .d /k8s .conf |
使用kubeadm初始化集群,在Master上执行下面的命令:
1 2 3 4 | kubeadm init \ --kubernetes-version=v1.9.0 \ --pod-network-cidr=10.244.0.0 /16 \ --apiserver-advertise-address=172.16.2.55 |
初始化信息:
1 2 3 4 5 6 7 8 | You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https: //kubernetes .io /docs/concepts/cluster-administration/addons/ You can now join any number of machines by running the following on each node as root: kubeadm join --token 7bc0ec.6dddfaf4372f196a 172.16.2.55:6443 --discovery-token-ca-cert-has |
按照提示使用集群:
1 2 3 | mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin .conf $HOME/.kube /config sudo chown $( id -u):$( id -g) $HOME/.kube /config |
查看集群状态:
1 2 3 4 5 | [root@iZbp15th6fsxatrsfbay9iZ images] # kubectl get cs NAME STATUS MESSAGE ERROR scheduler Healthy ok controller-manager Healthy ok etcd-0 Healthy { "health" : "true" } |
2.5.1 重置k8sadm
若之前的初始化没成功,需要重置,再重新初始化:
重置:
1 2 3 4 5 6 | kubeadm reset ifconfig cni0 down ip link delete cni0 ifconfig flannel.1 down ip link delete flannel.1 rm -rf /var/lib/cni/ |
然后重新初始化。
2.6 安装flannel
master节点上传并解压yaml包:
1 2 3 4 5 | mkdir /opt/yaml cd /opt/yaml tar zxvf k8s1.9.0.yaml. tar .gz cd yaml kubectl apply -f kube-flannel.yml |
使用kubectl get pod --all-namespaces -o wide确保所有的Pod都处于Running状态:
1 | kubectl get pod --all-namespaces -o wide |
集群在线部署篇
2.7 添加节点
所有Node节点执行:
1 2 3 4 5 6 7 | cat <<EOF> /etc/sysctl .d /k8s .conf net.ipv4.ip_forward=1 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl -p /etc/sysctl .d /k8s .conf kubeadm join --token 7bc0ec.6dddfaf4372f196a 172.16.2.55:6443 --discovery-token-ca-cert- hash sha256:8cc82d2293559436be8ef16bdfb761c0bbde1730fdfaf350c4ccddc607f6659 |
【问题】若出现以下现象:
1 2 3 4 5 | [WARNING FileExisting-crictl]: crictl not found in system path [preflight] Starting the kubelet service [discovery] Trying to connect to API Server "172.16.2.55:6443" [discovery] Created cluster-info discovery client, requesting info from "https://172.16.2.55:6443" [discovery] Failed to connect to API Server "172.16.2.55:6443" : there is no JWS signed token in the cluster-info ConfigMap. This token id "ea149b" is invalid for this cluster, can't connect |
【解决】在master节点重新生成一个
1 | kubeadm token create --print- join - command |
master节点执行:
2.7.1 移除并重新添加节点
若想移除节点(前提:该节点没有重要的服务)或者节点配置有问题想重新配置,则执行以下命令。
master节点:
1 | kubectl delete node k8s-node-01 |
k8s-node-01:
1 2 3 4 5 6 | kubeadm reset ifconfig cni0 down ip link delete cni0 ifconfig flannel.1 down ip link delete flannel.1 rm -rf /var/lib/cni/ |
2.8 测试DNS
master节点:
1 | kubectl run curl --image=radial /busyboxplus :curl -i -- tty |
1 2 3 4 5 6 7 8 9 10 | [root@k8s-master yaml] # kubectl run curl --image=radial/busyboxplus:curl -i --tty If you don't see a command prompt, try pressing enter. [ root@curl-545bbf5f9c-sf2vh:/ ]$ nslookup kubernetes.default Server: 10.96.0.10 Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster. local Name: kubernetes.default Address 1: 10.96.0.1 kubernetes.default.svc.cluster. local [ root@curl-545bbf5f9c-sf2vh:/ ]$ exit Session ended, resume using 'kubectl attach curl-545bbf5f9c-sf2vh -c curl -i -t' command when the pod is running |
若出现DNS解析不了的情况:
1 | nslookup : can 't resolve ' kubernetes.default' |
【解决】
1 2 | echo 'nameserver 10.96.0.10' >> /etc/resolv .conf kubectl -n kube-system delete pod kube-dns-xx |
2.9 dashboard插件部署
kubernetes-dashboard.yaml文件中的ServiceAccount kubernetes-dashboard只有相对较小的权限,因此我们创建一个kubernetes-dashboard-admin的ServiceAccount并授予集群admin的权限。
master节点:
1 2 | kubectl create -f kubernetes-dashboard.yaml kubectl create -f kubernetes-dashboard-admin.rbac.yaml |
查看kubernete-dashboard-admin的token:
1 2 | [root@k8s-master yaml] #kubectl -n kube-system get secret | grep kubernetes-dashboard-admin kubernetes-dashboard-admin-token-82vb6 kubernetes.io /service-account-token 3 13m |
返回的结果如下,token信息用于登录dashboard:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | [root@k8s-master yaml] #kubectl describe -n kube-system secret/kubernetes-dashboard-admin-token-82vb6 Name: kubernetes-dashboard-admin-token-82vb6 Namespace: kube-system Labels: <none> Annotations: kubernetes.io /service-account .name=kubernetes-dashboard-admin kubernetes.io /service-account .uid=236fa217-f413-11e7-9297-00163e0ed454 Type: kubernetes.io /service-account-token Data ==== ca.crt: 1025 bytes namespace: 11 bytes token: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC1hZG1pbi10b2tlbi04MnZiNiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC1hZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjIzNmZhMjE3LWY0MTMtMTFlNy05Mjk3LTAwMTYzZTBlZDQ1NCIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTprdWJlcm5ldGVzLWRhc2hib2FyZC1hZG1pbiJ9.Vfjwnl060xdjd06y-QUoE1z5WTH1ndXrLoqD0bhwqJqn4WCmqgnmzCUAi1rzTTuNlWW6afr3T8EjhuBlATGNfV-4NvQXRNr7JYrMKjW5Em5Fl1jTHnTzXK61CKos23leHJ4yFoHu4MXoGcQY4JSuqz5NvPD4ymj_Ug8c5VStTfCdfn88zLvNxY-nIoCsxVZTAipXP6EiB_j9kJBb03JwgoZxtC_ZqIphbXSKWhlL5V6epZ2G5-lh_nPEpFueaimDK-r3yAdJ2uo-BQhkRnH6zb3Tvdy03nYgR9msW9IMM4q-vxZ3ok8sbcZXuuUW9InCexnttenZe90fL6PMPHUTww |
2.10 安装heapster插件
安装Heapster为集群添加使用统计和监控功能,为Dashboard添加仪表盘。
master节点执行:
1 2 | cd heapster/ kubectl create -f ./ |
查看pod状态:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [root@k8s-master heapster] # kubectl get pods --all-namespaces -o wide NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE default curl-545bbf5f9c-sf2vh 1 /1 Running 1 4m 10.244.1.24 k8s-node-01 kube-system etcd-k8s-master 1 /1 Running 0 11m 172.16.2.55 k8s-master kube-system heapster-dfd674df9-pnhfn 1 /1 Running 0 16s 10.244.1.28 k8s-node-01 kube-system kube-apiserver-k8s-master 1 /1 Running 0 11m 172.16.2.55 k8s-master kube-system kube-controller-manager-k8s-master 1 /1 Running 0 11m 172.16.2.55 k8s-master kube-system kube-dns-6f4fd4bdf-f2ssn 3 /3 Running 0 12m 10.244.0.5 k8s-master kube-system kube-flannel-ds-k4pnm 1 /1 Running 0 10m 172.16.2.55 k8s-master kube-system kube-flannel-ds-t2jmp 1 /1 Running 0 6m 172.16.2.79 k8s-node-01 kube-system kube-proxy-9dzwl 1 /1 Running 0 6m 172.16.2.79 k8s-node-01 kube-system kube-proxy-hv96h 1 /1 Running 0 12m 172.16.2.55 k8s-master kube-system kube-scheduler-k8s-master 1 /1 Running 0 11m 172.16.2.55 k8s-master kube-system kubernetes-dashboard-7b7b5cd79b-4brdm 1 /1 Running 0 2m 10.244.1.25 k8s-node-01 kube-system monitoring-grafana-76848b566c-6vs8x 1 /1 Running 0 17s 10.244.1.26 k8s-node-01 kube-system monitoring-influxdb-6c4b84d695-k4xsh 1 /1 Running 0 17s 10.244.1.27 k8s-node-01 |
2.11 使用nodeport方式访问
把type: ClusterIP 改成 type: NodePort ,加入nodePort: 30010,然后保存:
1 2 | kubectl -n kube-system edit service kubernetes-dashboard kubectl -n kube-system get service kubernetes-dashboard |
2.12 打开dashboard
火狐浏览器输入https://192.168.110.76:30010
选择令牌,将之前token信息复制进去,然后登陆.
2.13 添加ssl证书
若需要使用域名访问dashboard,则必须修改ssl证书。
在master节点创建cert目录:
1 | mkdir -p /alidata/application-data/cert/ |
1 2 3 | kubectl delete -f kubernetes-dashboard.yaml kubectl create secret generic kubernetes-dashboard-certs --from- file = /alidata/application-data/cert/ -n kube-system kubectl apply -f kubernetes-dashboard.yaml |
还需要重新修改node方式访问。将ssl证书上传到该目录。
执行以下命令:
成功后,就可以通过https://k8s.ibuscloud.com:30010访问了。
3、k8s使用ipvs
3.1 确认ipvs模块
各节点执行以下命令:
1 2 | lsmod | grep ip_vs yum -y install ipvsadm |
3.2 安装kube-router
master节点执行以下命令:
1 2 3 4 | kubectl apply -f kubeadm-kuberouter-all-features.yaml kubectl get po --all-namespaces kubectl delete ds kube-proxy -n kube-system docker run --privileged --net=host gcr.io /google_containers/kube-proxy-amd64 :v1.9.0 kube-proxy --cleanup-iptables |
3.3 验证ipvs
在master节点上执行以下命令:
1 2 3 | kubectl run myip --image=cloudnativelabs /whats-my-ip --replicas=2 --port=8080 kubectl expose deployment myip --port=8080 --target-port=8080 -- type =NodePort kubectl get svc |

4、docker仓库harbor
4.1 前置条件
需要安装docker,并修改docker启动项和配置文件,允许访问harbor。
安装docker-compose:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [root@k8s-master yaml] #curl k8s-node-02:30179 HOSTNAME:myip-859c596bbf-7zmkh IP:10.244.1.4 [root@k8s-master yaml] #curl k8s-node-02:30179 ^C [root@k8s-master yaml] #curl k8s-node-02:30179 HOSTNAME:myip-859c596bbf-7zmkh IP:10.244.1.4 [root@k8s-master yaml] #curl k8s-node-02:30179 ^C [root@k8s-master yaml] #curl k8s-node-02:30179 HOSTNAME:myip-859c596bbf-7zmkh IP:10.244.1.4 [root@k8s-master yaml] #curl k8s-node-02:30179 ^C [root@k8s-master yaml] #curl k8s-master:30179 ^C [root@k8s-master yaml] #curl k8s-master:30179 |
【解决】
重启网络,执行以下命令:
1 2 3 4 | kubectl delete -f kubeadm-kuberouter-all-features.yaml kubectl delete -f kube-flannel.yml kubectl apply -f kubeadm-kuberouter-all-features.yaml kubectl apply -f kube-flannel.yml |
注意:先起kube-router,再起kube-flannel,否则无效。若重启一遍还存在问题,那么多重启几遍。
4.2 安装
将harbor安装在master节点,安装步骤:
1 2 3 4 5 6 | mkdir /alidata/harbor cd /alidata/harbor wget https: //github .com /vmware/harbor/releases/download/v1 .2.2 /harbor-offline-installer-v1 .2.2.tgz tar zxvf harbor-offline-installer-v1.2.2.tgz cd harbor . /install . |
4.3 登录仓库web
输入地址:http://192.168.110.75/harbor
用户名:admin
初始密码:harbor目录下的harbor.cfg文件中配置的密码
登录后:
4.4 拉取和推送
任一节点,登录docker仓库:
1 | docker login 172.16.2.55 |
如果出现类似以下问题:
1 | Get https: //172 .16.2.55 /v1/_ping : dial tcp 172.16.2.55:443: getsockopt: connection refused |
【解决】
按照这个步骤配置。
测试拉取和推送
在node-01推送一个镜像:
1 2 | docker tag centos:latest 172.16.2.55 /library/centos :1.0 docker push 172.16.2.55 /library/centos :1.0 |
在node-02拉取一个镜像:
1 | docker pull 172.16.2.55 /library/centos :1.0 |
4.5 添加https访问
修改harbor.cfg文件:
1 2 3 4 | hostname = k8s.ibuscloud.com ui_url_protocol = https ssl_cert = /alidata/application-data/cert/dashboard .crt ssl_cert_key = /alidata/application-data/cert/dashboard .key |
执行以下命令:
1 2 3 4 | cd /alidata/harbor . /prepare docker-compose down docker-compose up -d |
【验证】 https://k8s.ibuscloud.com/harbor/
5、jenkins
5.1 启动jenkins
由于之前已经对jenkins做了配置,安装好了插件和f6环境,当前只需要启动jenkins即可。
jenkins容器指定了运行的宿主机(k8s-node-01),且挂载了本地目录,用于数据持久化。
创建新的namespace,命名为jenkins,再创建service,最后创建deploymet,执行以下命令:
1 2 3 | kubectl create namespace jenkins kubectl create -f /alidata/yaml/jenkins/jenkins-service .yaml kubectl create -f /alidata/yaml/jenkins/jenkins-rc .yaml |
注:jenkins-service.yaml和jenkins-rc.yaml指定了namespace为jenkins。