微服务架构 - 离线部署k8s平台并部署测试实例

一般在公司部署或者真实环境部署k8s平台,很有可能是内网环境,也即意味着是无法连接互联网的环境,这时就需要离线部署k8s平台。在此整理离线部署k8s的步骤,分享给大家,有什么不足之处,欢迎指正。

1、准备环境

这次离线部署k8s的版本为v1.10.1,同时docker的版本为17.12.0-ce,不过本文章不介绍如何离线部署docker,如果大家要看的话,可以看本人之前写的文章CentOS7离线部署docker

本人准备的环境是3台虚拟机,也即1台master节点,2个node节点,ip及配置如下:

主机名 IP 内存
k8s-master 192.168.197.131 2G
k8s-node-1 192.168.197.132 1G
k8s-node-2 192.168.197.133 1G

2、设置环境

(1)、所有节点关闭防火墙,操作命令如下:

systemctl stop firewalld
systemctl disable firewalld

(2)、所有节点关闭selinux,操作命令如下:

setenforce 0

同时编辑/etc/selinux/config,使其中SELINUX=disabled

(3)、所有节点关闭swap,操作命令如下:

swapoff -a

同时编辑/etc/fstab,注释掉含有swap的这一行

(4)、所有节点设置系统参数,操作如下命令:

cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

3、安装kubeadm、kubelet、kubectl

相关的rpm安装包,已经提前下载好了,需要如下文件:

在每个节点都安装这些rpm安装包,安装命令如下:

rpm -ivh *.rpm

设置Cgroup Driver,由于kubelet的Cgroup Driver为systemd,而docker的Cgroup Driver信息可以通过:

docker info

返回的信息为:

可以发现docker的Cgroup Driver为cgroupfs,为此将kubelet的Cgroup Driver修改为cgroupfs,即修改/etc/systemd/system/kubelet.service.d/10-kubeadm.conf,将其中的cgroup-driver=systemd改为cgroupfs

注意:所有节点kubelet的Cgroup Driver都要修改为cgroupfs

所有节点重设kubelet服务,并重启kubelet服务,同时设置为开机自启动,即:

systemctl daemon-reload && systemctl restart kubelet
systemctl enable kubelet

4、准备镜像

相关要用到的镜像,已经提前下载好了(文章最后会提供下载所有安装文件的地址),只需要用docker load命令将镜像导入即可,注意所有的节点都需要导入这些镜像, 镜像列表如下:

5、部署master节点

通过kubeadm初始化master节点,在master节点上执行:

kubeadm init --kubernetes-version=v1.10.1 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.197.131

由于在此网络配置采用flannel,所以--pod-network-cidr设置为10.244.0.0/16

该命令执行完后,如果看到如下结果,则表示初始化成功,即:

Your Kubernetes master has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

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 192.168.197.131:6443 --token io9qub.vnikk4mxx2vr3g05 --discovery-token-ca-cert-hash sha256:9353632362d10d676b6ad69cd7675bf2facd71e265ffcf1b69a9bcd4d0e2dd3e

则需要按照提示,执行如下命令:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

同时将其它node节点加入k8s集群命令记好,等下后面需要用到的。

紧接着在master节点部署网络插件flannel,这时可以通过kubectl命令来安装,即:

kubectl apply -f kube-flannel.yml

注意:kube-flannel.yml文件,可以在https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml获取到,当然文章最后提供的安装包里面也有该文件的。

此时可以查看master的状态,即输入如下命令:

kubectl get nodes

结果为:

可见看到master的状态为Ready,即表明master节点部署成功!

6、加入node节点

加入node节点的操作就很简单了,只需要将上面初始化master节点成功后返回的join命令,在所有node节点上执行即可,即:

kubeadm join 192.168.197.131:6443 --token io9qub.vnikk4mxx2vr3g05 --discovery-token-ca-cert-hash sha256:9353632362d10d676b6ad69cd7675bf2facd71e265ffcf1b69a9bcd4d0e2dd3e

如果这个join命令忘记保存,可以在master节点执行如下命令获取join命令的:

kubeadm token create --print-join-command

所有的node节点都加入后,可以在master节点执行命令查看各个节点的状态,即:

kubectl get nodes

结果为:

由上可知所有节点的状态都Ready,说明部署成功了!

也可查看一下所有pod的状态,即执行:

kubectl get pods --all-namespaces

结果为:

7、自定义证书并部署dashboard

在master节点的/root/k8s/ssl目录下制作证书:

(1)、生成私钥:

openssl genrsa -out ca.key 2048

(2)、生成自签名证书:

openssl req -new -x509 -key ca.key -out ca.crt -days 3650 -subj "/C=CN/ST=HB/L=WH/O=DM/OU=YPT/CN=CA"

(3)、生成dashboard私钥:

openssl genrsa -out dashboard.key 2048

(4)、申请签名请求:

openssl req -new -sha256 -key dashboard.key -out dashboard.csr -subj "/C=CN/ST=HB/L=WH/O=DM/OU=YPT/CN=192.168.197.131"

(5)、创建配置文件dashboard.cnf ,内容如下:

extensions = san
[san]
keyUsage = digitalSignature
extendedKeyUsage = clientAuth,serverAuth
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
subjectAltName = IP:192.168.197.131,IP:127.0.0.1,DNS:192.168.197.131,DNS:localhost,DNS:k8s-master

(6)、签发证书:

openssl x509 -req -sha256 -days 3650 -in dashboard.csr -out dashboard.crt -CA ca.crt -CAkey ca.key -CAcreateserial -extfile dashboard.cnf

(7)、将证书信息放到secret中:

kubectl create secret generic kubernetes-dashboard-certs --from-file="dashboard.crt,dashboard.key" -n kube-system 

(8)、安装kubernetes-dashboard.yml,即执行:

kubectl apply -f kubernetes-dashboard.yml

其中kubernetes-dashboard.yml文件文章最后的安装包里面会提供。

(9)、设置dashboard的admin权利:

由于kubernetes-dashboard绑定的角色为kubernetes-dashboard-minimal,为了提供admin权限则需要执行:

kubectl apply -f kubernetes-dashboard-rbac-admin.yml

其中 kubernetes-dashboard-rbac-admin.yml文件文章最后的安装包里面会提供。

(10)、查看pod、svc状态

输入kubectl get pods --all-namespaces,可以看到有这么一条信息:

kube-system   kubernetes-dashboard-7d5dcdb6d9-nszwk   1/1       Running   1

输入kubectl get svc -n kube-system,可以看到有这么一条信息:

kubernetes-dashboard   NodePort    10.107.115.153   <none>        443:31195/TCP

此根据NodePort模式下,对外访问dashboard的端口为31195,即:在浏览器中输入:

https://192.168.197.131:31195

注意是https协议。

可看到如下页面:

可以通过令牌的访问方式进入,即首先得获取令牌信息:

(1)、首先得到kubernetes-dashboard-admin的secret记录,即:

kubectl get secret --all-namespaces | grep kubernetes-dashboard-admin

得到的结果为:

kube-system   kubernetes-dashboard-admin-token-75pdg           kubernetes.io/service-account-token   3

(2)、获取token值,即通过上面secret结果,然后执行如:

kubectl describe secret kubernetes-dashboard-admin-token-75pdg -n kube-system

得到的结果为:

这个token值输入到浏览器中令牌所需要的内容即可以登录,即:

8、部署自定义测试实例

本人通过SpringBoot写了一个简单的工程,只有一个测试方法,即:

package com.swnote.k8s.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 * 测试类
 *
 * @author lzj
 * @date [2019-03-16]
 */
@RestController
public class TestController {

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String index() {
        return "架构与我,欢迎关注!";
    }
}

然后将本工程打成jar包,然后通过Dockerfile文件打成镜像,Dockerfile文件如下:

FROM java:8
VOLUME /tmp
ADD k8s-jgyw-1.0.jar app.jar
#RUN bash -c 'touch /app.jar'
EXPOSE 80
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

执行打镜像的命令:

docker build -t k8s-jgyw:1.0 .

注意所有的节点都需要k8s-jgyw:1.0镜像,然后部署该实例k8s-jgyw.yml如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: jgyw
  labels:
    app: k8s-jgyw
spec:
  replicas: 1
  selector:
    matchLabels:
      app: k8s-jgyw
  template:
    metadata:
      labels:
        app: k8s-jgyw
    spec:
      containers:
        - name: jgyw
          image: k8s-jgyw:1.0
          ports:
            - containerPort: 80
              protocol: TCP

---
apiVersion: v1
kind: Service
metadata:
  name: jgyw
  labels:
    app: k8s-jgyw
spec:
  type: NodePort
  selector:
    app: k8s-jgyw
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

执行部署命令:

kubectl apply -f k8s-jgyw.yml

然后svc信息,获取对外访问的端口,即:

kubectl get svc

返回结果为:

jgyw         NodePort    10.97.250.52   <none>        80:32461/TCP

则通过浏览器访问如下地址:

http://192.168.197.131:32461

结果如下:

说明测试实例部署成功了!

9、安装包下载地址

安装包的下载为https://pan.baidu.com/s/1r0OkljXdmXx37h9aHDLDDg,提取码为:m11n

关注我

以你最方便的方式关注我:
微信公众号:

原文地址:https://www.cnblogs.com/atcloud/p/10614326.html

时间: 2024-11-05 19:05:10

微服务架构 - 离线部署k8s平台并部署测试实例的相关文章

(转)微服务架构 互联网保险O2O平台微服务架构设计

http://www.cnblogs.com/Leo_wl/p/5049722.html 微服务架构 互联网保险O2O平台微服务架构设计 关于架构,笔者认为并不是越复杂越好,而是相反,简单就是硬道理也提现在这里.这也是微服务能够流行的原因,看看市场上曾经出现的服务架构:EJB.SCA.Dubbo等等,都比微服务先进,都比微服务功能完善,但它们都没有微服务这么深入民心,就是因为他们过于复杂.简单就是高科技,苹果手机据说专门有个团队研究如何能让用户更加简单的操作.大公司都是由小公司发展起来的,如果小

【2】微服务架构-kong的集群化部署

一:Kong的集群方案 Kong支持集群方案,可以加入多个Kong节点来保障服务的高可用性以及提高负载的能力,如下面官方图所示,多个kong组成的集群需要使用共享数据库,以保证集群数据的一致性. (1)集群状态 检查集群的状态 $kong cluster reachability 检查群集的成员 $kong cluster members (2)集群配置 集群配置包含以下几项 cluster_listen         用于与群集中其他节点之间通信的地址和端口. 默认值: 0.0.0.0:79

谈微服务架构(转)

时间 2016-03-22 11:38:33  人月神话的BLOG 原文  http://blog.sina.com.cn/s/blog_493a84550102w5x6.html 主题 微服务 其实在前面很多文章谈到SOA,特别是系统内的SOA和组件化的时候已经很多内容和微服务架构思想是相同的,对于微服务架构,既然出现了这个新名称,那就再谈下微服务架构本身的一些特点和特性. 从这个图可以看到微服务架构的第一个重点,即业务系统本身的组件化和服务化,原来开发一个业务系统本身虽然分了组件和模块,但是

SOA和微服务架构的区别?

知乎用户 289 人赞同了该回答 谢多人邀请,其实前面几位的回答已经差不多了,在这里仅谈下自己的简单总结. 微服务架构强调的第一个重点就是业务系统需要彻底的组件化和服务化,原有的单个业务系统会拆分为多个可以独立开发,设计,运行和运维的小应用.这些小应用之间通过服务完成交互和集成.每个小应用从前端web ui,到控制层,逻辑层,数据库访问,数据库都完全是独立的一套.在这里我们不用组件而用小应用这个词更加合适,每个小应用除了完成自身本身的业务功能外,重点就是还需要消费外部其它应用暴露的服务,同时自身

微服务架构探讨及甲骨文中间件微服务技术解决方案

https://mp.weixin.qq.com/s/IWR_wIh2D-RmPuslR_JnXg 微服务架构探讨及甲骨文中间件微服务技术解决方案 2017-04-12 胡平 甲骨文开发者社区 随着传统企业受到互联网+的冲击,越来越多的企业都在面临业务转型,如何更好地贴近客户以获取更高的客户满意度,如何在企业内部加速供给侧改革,实现更好的供需平衡都是企业在业务转型中需要思考的问题.企业业务转型,离不开底层IT架构的支撑,所以最近很多很火的技术理念不断被大家所谈及,包括微服务架构.DevOps开发

企业应用架构之微服务架构

微服务架构现在是谈到企业应用架构时必聊的话题,微服务之所以火热也是因为相对之前的应用开发方式有很多优点,如更灵活.更能适应现在需求快速变更的大环境. 本文将介绍微服务架构的演进.优缺点和微服务应用的设计原则,然后着重介绍作为一个"微服务应用平台"需要提供哪些能力.解决哪些问题才能更好的支撑企业应用架构. 微服务平台也是我目前正在参与的,还在研发过程中的平台产品,平台是以SpringCloud为基础,结合了普元多年来对企业应用的理解和产品的设计经验,逐步孵化的一个微服务应用平台. 目录:

SOA和微服务架构的区别

微服务架构强调的第一个重点就是业务系统需要彻底的组件化和服务化,原有的单个业务系统会拆分为多个可以独立开发,设计,运行和运维的小应用.这些小应用之间通过服务完成交互和集成.每个小应用从前端web ui,到控制层,逻辑层,数据库访问,数据库都完全是独立的一套.在这里我们不用组件而用小应用这个词更加合适,每个小应用除了完成自身本身的业务功能外,重点就是还需要消费外部其它应用暴露的服务,同时自身也将自身的能力朝外部发布为服务. 如果一句话来谈SOA和微服务的区别,即微服务不再强调传统SOA架构里面比较

微服务架构实践

目录 业务背景 微服务概念 微服务技术选型 微服务架构设计 微服务架构设计落地 微服务架构设计过程中积累的心得 总结 一.业务背景 1.1 产品现状 1.各产品系统独立开发,代码复用率低,系统之间互相调用,耦合严重,系统解耦独立部署困难. 2.传统的单体架构,规模越来越大也越来越笨重:当新功能的开发.功能的重构变得不再敏捷可控:测试者的回归测试边界难以琢磨:系统的上线部署也变的艰难 3.高并发访问下无法提供可靠性服务 4.持续集成.持续部署.持续交付等工程效率化工具严重缺失 5.监控系统.日志分

细说微服务架构的优势与不足那点事

摘要: 一个微服务一般完成某个特定的功能,比如下单管理.客户管理等等.每一个微服务都是微型六角形应用,都有自己的业务逻辑和适配器.一些微服务还 会发布API给其它微服务和应用客户端使用.其它微服务完成一个Web UI,运行时,每一个实例可能是一个云VM或者是Docker容器. 微服务正在博客.社交媒体讨论组和会议演讲中获得越来越多的关注,在Gartner的2014 Hype Cycle上它的排名非常靠前.同时,软件社区中也有不少持怀疑论者,认为微服务不是什么新东西.Naysayers认为这就是S