前言
k8s集群是目前中大型公司的首选微服务部署方案,包括高可用,便捷性等等,但是也有人建议中小厂最好不用k8s去部署,因为这意味着你需要有一个专门的精通k8s的运维工程师去解决各种大大小小的问题,但说实话不难,你遇到的问题,99%都能在网上搜索到。
所以我个人的观点是能用则用,当然如果是裸金属服务器的话,成本那就比较高了,但是如果你是用虚拟化技术来创建集群的话成本就小一点。
正文
废话少说,开始干!
环境准备
以我本次的demo为例,环境准备3台centOS7虚拟机。
配置好国内源
1 2 3
| wget http://mirrors.aliyun.com/repo/Centos-7.repo // 没有wget用curl curl -o Cenos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
|
安装ntp,同步时钟
1 2 3 4 5
| yum install ntp systemctl enable ntpd // 手动同步时钟 ntpdate ntp1.aliyun.com // 需要持续可用的话需要配合cron做定时同步
|
关闭防火墙!!
1 2
| systemctl stop firewalld systemctl disable firewalld
|
安装新一点的docker
1 2 3 4
| yum remove docker docker-common docker-selinux docker-engine // 添加docker仓库 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum install docker-ce
|
修改三台虚拟机的hostname分别为worker1, worker2, worker3
1 2
| vi /etc/hostname worker1
|
固定三台虚拟机的ip地址,子网根据vmnet8所分配的,你也可以自行更改。ip分别为192.168.28.138,192.168.28.139,192.168.28.140.
1 2 3 4 5 6 7 8 9 10
| // vmware的虚拟机网卡基本上都叫ens33 vi /etc/sysconfig/network-scripts/ifcfg-ens33 修改BOOTPROTO=static和ONBOOT=yes 增加 IPADDR=192.168.28.138 NETMASK=255.255.255.0 NETWORK=192.168.28.0 BROADCAST=192.168.28.255 DNS1=192.168.28.2 GATEWAY=192.168.28.2
|
增加dns映射,三台都加
1 2 3 4
| vi /etc/hosts 192.168.28.138 worker1 192.168.28.139 worker2 192.168.28.140 worker3
|
由于目前国内的网络环境,不管是rpm包还是docker镜像,都有可能拉取不下来,强烈建议在本机开放允许局域网的连接来使用飞机。在需要时可能会用到。
1 2 3
| export https_proxy="https://192.168.28.1:10801/" export http_proxy="http://192.168.28.1:10801/" export no_proxy="localhost,127.0.0.1,.example.com,192.168.28.0/16"
|
配置docker代理或镜像源。镜像源我就不配置了,目前国内源懂得都懂,这里介绍配置docker pull使用代理。
1 2 3 4 5 6 7
| mkdir /etc/systemd/system/docker.service.d vi /etc/systemd/system/docker.service.d/proxy.conf // 把以下代理内容写进去,注意不需要写http(s)协议 [Service] Environment="HTTP_PROXY=192.168.28.1:10801" Environment="HTTPS_PROXY=192.168.28.1:10801" Environment="NO_PROXY=localhost,127.0.0.1,.example.com,192.168.28.0/16"
|
重启下docker
1 2 3 4
| systemctl daemon-reload systemctl restart docker
docker info出现HTTP Proxy说明配置完成
|
至此准备工作就此完成!
创建k8s集群
这里我推荐使用k3s, 一个轻量的k8s集群,没有etcd作为存储,因此如果需要使用在生产环境中建议配置etcd,这里我们采取默认脚本来安装,十分简单。
先在终端中将代理export下,然后执行
1
| curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--docker" sh -
|
这里我们依旧采用docker作为容器运行时。
安装完成后kubeconfig文件被放在/etc/rancher/k3s/k3s.yaml
中。
接着执行cat /var/lib/rancher/k3s/server/node-toke
获取主节点的token。然后在其他节点上执行(也是记得export)
1
| curl -sfL https://get.k3s.io | K3S_URL=https://worker1:6443 K3S_TOKEN=获取的token INSTALL_K3S_EXEC="--docker" sh -
|
子节点全部启动agent成功后,在主节点执行kubectl get nodes
看见其他节点就说明安装完成了,前后不超过5分钟。
当然此时子节点还没有标签,我们可以打上
1 2 3 4
| kubectl label node worker2 node-role.kubernetes.io/worker=worker kubectl label node worker3 node-role.kubernetes.io/worker=worker // 当然主节点worker1也可以标上工作节点 kubectl label node worker1 node-role.kubernetes.io/worker=worker
|
这里还有个小点,就是当终端中有那些代理的变量时,这些变量会写入到/etc/systemd/system/k3s.service.env
,作为后续kubectl的使用代理,如果没有配置no_proxy需要加上,当然你也可以去掉代理,然后重启k3s服务,否则例如kubectl logs
可能会提示代理出错。可以参考官方wiki.
安装kubepi面板
kubepi是一个开源的k8s面板,个人觉得挺好用的,装一个可以清楚看到容器的运行状态,不用再去一个个敲命令。官方wiki中也有详细的部署教程,但是持久化部署官方用的nfs,集群刚搭建起来怎么会有呢,因此我稍微改了一下,把存储放到本地了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
| vim kubepi-pvc.yaml
apiVersion: v1 kind: ServiceAccount metadata: name: kubepi-user namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: kubepi-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: kubepi-user namespace: kube-system
--- kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: namespace: kube-system name: local-storage provisioner: kubernetes.io/no-provisioner volumeBindingMode: WaitForFirstConsumer
--- apiVersion: v1 kind: PersistentVolume metadata: name: kubepi-pv namespace: kube-system labels: app.kubernetes.io/name: kubepi spec: storageClassName: local-storage capacity: storage: 10Gi volumeMode: Filesystem accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Delete local: path: /home/k8s/kubepi nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - worker1 --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: kubepi-pv-claim namespace: kube-system labels: app.kubernetes.io/name: kubepi spec: storageClassName: local-storage accessModes: - ReadWriteMany resources: requests: storage: 10Gi
---
apiVersion: v1 kind: Service metadata: name: kubepi namespace: kube-system spec: type: NodePort ports: - name: http port: 80 targetPort: 80 protocol: TCP selector: app.kubernetes.io/name: kubepi
---
apiVersion: apps/v1 kind: Deployment metadata: name: kubepi namespace: kube-system labels: app.kubernetes.io/name: kubepi spec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: kubepi template: metadata: labels: app.kubernetes.io/name: kubepi spec: containers: - name: kubepi image: kubeoperator/kubepi-server:latest imagePullPolicy: Always ports: - containerPort: 80 protocol: TCP securityContext: privileged: true volumeMounts: - name: kubepi-persistent-storage mountPath: /var/lib/kubepi volumes: - name: kubepi-persistent-storage persistentVolumeClaim: claimName: kubepi-pv-claim
|
需要修改的是节点亲和性相关,由于local-path使用的是本机存储需要指定主机,因此pv创建需要有节点条件,修改matchExpressions的[0].value改为你想部署的节点hostname即可。然后/home/k8s/kubepi
可以提前创建目录出来,不确定k8s会不会自动创建。
接下来就是获取nodePort暴露的端口,这个官方有。
export NODE_PORT=$(kubectl -n kube-system get services kubepi -o jsonpath="{.spec.ports[0].nodePort}")
由于上述我们改了节点亲和性,因此访问的地址就是http://worker1:$NODE_PORT
,账号为admin,密码为kubepi
当然我们也可以固定下来端口,例如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| apiVersion: v1 kind: Service metadata: name: kubepi namespace: kube-system spec: type: NodePort ports: - name: http port: 80 targetPort: 80 protocol: TCP nodePort: 31779 selector: app.kubernetes.io/name: kubepi
|
至此就完成了一个简单的三节点k8s集群的搭建了。