记一次阿里云k8s部署

阿里云资源准备

服务器

ip 角色 资源
192.168.1.160 master1 2核4G
192.168.1.161 master2 2核4G
192.168.1.162 master3 2核4G
192.168.1.159 node2 2核4G
192.168.1.158 node1 2核4G
192.168.1.158 haproxy
192.168.1.159 nfs
47.97.195.116 弹性公网IP 绑定192.168.1.160

ecs

密钥对

安全组

弹性公网IP

专有网络

交换机

连接设置

1 在绑定弹性公网IP服务上设置密码

2 在安全组上开放SSH 22 端口

3 使用secureCRT连接绑定弹性公网IP服务器

4 在内网 使用密钥对 连接

上传密钥对 sicc.pem 文件至 192.168.1.160 /root/.ssh/目录下

vi /root/.bashrc
alias go161='ssh -i /root/.ssh/sicc.pem root@192.168.1.161'
alias go162='ssh -i /root/.ssh/sicc.pem root@192.168.1.162'
alias go158='ssh -i /root/.ssh/sicc.pem root@192.168.1.158'
alias go159='ssh -i /root/.ssh/sicc.pem root@192.168.1.159'

这样 就可以通过 192.168.1.160 去使用go161 到任意服务器

K8S集群安装

1 服务器初始化

#确认每台机器的时区和时间都正确   做定时任务同步阿里云时钟
crontab -e
*/30 * * * * /usr/sbin/ntpdate -u ntp.cloud.aliyuncs.com;clock -w#每台机器设置主机名
hostnamectl set-hostname <hostname>#每台机器添加所有机器的主机名到ip的映射  158 装了haproxy4层负载apiserver
cat << EOF >> /etc/hosts
192.168.1.160 master1
192.168.1.161 master2
192.168.1.162 master3
192.168.1.159 node2
192.168.1.158 node1
192.168.1.158 apiserver-haproxy
EOF#每台修改内核参数
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOFsysctl --system#每台禁用每台机器的swap      阿里云服务器本身无swap
swapoff -a
sed -i.bak '/ swap /s/^/#/' /etc/fstab#每台机器关闭firewalld防火墙和selinux  阿里云服务器已经关闭
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config#每台机器添加阿里k8s和docker的官方yum repo
cat << EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOFyum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo#每台安装指定版本docker
yum install docker-ce-19.03.8-3 docker-ce-cli-19.03.8-3 containerd.io#每台机器安装指定版本kubeadm,kubelet,kubectl --disableexcludes=kubernetes  禁掉除了这个之外的别的仓库
yum install -y kubelet-1.18.2 kubeadm-1.18.2 kubectl-1.18.2 --disableexcludes=kubernetes
#kubeadm:用来初始化集群的指令。
#kubelet:在集群中的每个节点上用来启动pod和容器等。
#kubectl:用来与集群通信的命令行工具。

2 192.168.1.158haproxy负责均衡安装

yum -y install haproxy
#修改配置文件 增加在最后
vim /etc/haproxy/haproxy.cfg
listen  k8s_master   192.168.1.158:6443    mode tcp          #配置TCP模式    maxconn 2000    balance roundrobin    server  master1 192.168.1.160:6443 check port 6443 inter 5000 rise 3 fall 3 weight 3   server  master2 192.168.1.161:6443 check port 6443 inter 5000 rise 3 fall 3 weight 3   server  master3 192.168.1.162:6443 check port 6443 inter 5000 rise 3 fall 3 weight 3   srvtimeout      20000

k8s集群master节点配置

#在master1执行初始化init命令
kubeadm init --kubernetes-version  1.18.2 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers  --control-plane-endpoint apiserver-haproxy:6443 --upload-certs
#–image-repository:默认master初始化时,k8s会从k8s.gcr.io拉取容器镜像,由于国内此地址访问不到,故调整为阿里云仓库
#–control-plane-endpoint: 配置VIP地址映射的域名和port
#–upload-certs:将master之间的共享证书上传到集群#结果
Your Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configYou 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 the control-plane node running the following command on each as root:kubeadm join apiserver-haproxy:6443 --token i7ffha.cbp9wse6jhy4uz2q \--discovery-token-ca-cert-hash sha256:1f084d1ac878308635f1dbe8676bac33fe3df6d52fa212834787a0bc71f1db6d \--control-plane --certificate-key e6d08e338ee5e0178a85c01067e223d2a00b5ac0e452bca58561976cf2187dd5Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.Then you can join any number of worker nodes by running the following on each as root:kubeadm join apiserver-haproxy:6443 --token i7ffha.cbp9wse6jhy4uz2q \--discovery-token-ca-cert-hash sha256:1f084d1ac878308635f1dbe8676bac33fe3df6d52fa212834787a0bc71f1db6d#根据步骤3的输出提示在master1上执行如下命令
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config#安装Calico网络也是高可用
wget https://docs.projectcalico.org/v3.14/manifests/calico.yaml
kubectl apply -f calico.yaml#过10min左右在master1上执行如下命令查看所有的pod是否都处于Running状态,然后再继续接下来的步骤
kubectl get pods -A -o wide#如果初始化有问题,则执行如下命令后重新初始化
kubeadm reset
rm -rf $HOME/.kube/config#在master上执行验证API Server是否正常访问(需要负载均衡正确配置完成)
curl  https://apiserver-lb:6443/version -k
{"major": "1","minor": "18","gitVersion": "v1.18.2","gitCommit": "52c56ce7a8272c798dbc29846288d7cd9fbae032","gitTreeState": "clean","buildDate": "2020-04-16T11:48:36Z","goVersion": "go1.13.9","compiler": "gc","platform": "linux/amd64"#如上输出已经提供了初始化其它master和其它work节点的命令(token有过期时间,默认2h,过期则如上命令就失效,需要手动重新生成token),但是需要等master1上所有服务都就绪后才能执行,具体见接下来的步骤。
#kubeadm init phase upload-certs --upload-certs  #获取新的token#如果距master1初始化时间没超过2h,则在master2和master3执行如下命令,开始初始化
kubeadm join apiserver-haproxy:6443 --token i7ffha.cbp9wse6jhy4uz2q \--discovery-token-ca-cert-hash sha256:1f084d1ac878308635f1dbe8676bac33fe3df6d52fa212834787a0bc71f1db6d \--control-plane --certificate-key e6d08e338ee5e0178a85c01067e223d2a00b5ac0e452bca58561976cf2187dd5#如果距master1初始化时间没超过2h,则在node1和node2执行如下命令,开始初始化
kubeadm join apiserver-haproxy:6443 --token i7ffha.cbp9wse6jhy4uz2q \--discovery-token-ca-cert-hash sha256:1f084d1ac878308635f1dbe8676bac33fe3df6d52fa212834787a0bc71f1db6d

部署redis集群

部署nfs

#安装服务
yum -y install nfs-utils
yum -y install rpcbind
#新增/etc/exports文件,用于设置需要共享的路径
[root@node2 ~]# cat /etc/exports
/home/k8s/redis/pv1 192.168.1.0/24(rw,sync,no_root_squash)
/home/k8s/redis/pv2 192.168.1.0/24(rw,sync,no_root_squash)
/home/k8s/redis/pv3 192.168.1.0/24(rw,sync,no_root_squash)
/home/k8s/redis/pv4 192.168.1.0/24(rw,sync,no_root_squash)
/home/k8s/redis/pv5 192.168.1.0/24(rw,sync,no_root_squash)
/home/k8s/redis/pv6 192.168.1.0/24(rw,sync,no_root_squash)
#创建相应目录
mkdir -p /home/k8s/redis/pv{1..6}
#启动NFS和rpcbind服务
systemctl restart rpcbind
systemctl restart nfs
systemctl enable nfs

node1 node2 节点安装nfs客户端 不然无法挂载

yum -y install nfs-utils

创建PV

kubectl create -f pv.yaml
cat pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: nfs-pv1
spec:capacity:storage: 200MaccessModes:- ReadWriteManynfs:server: 192.168.1.159path: "/home/k8s/redis/pv1"---
apiVersion: v1
kind: PersistentVolume
metadata:name: nfs-vp2
spec:capacity:storage: 200MaccessModes:- ReadWriteManynfs:server: 192.168.1.159path: "/home/k8s/redis/pv2"---
apiVersion: v1
kind: PersistentVolume
metadata:name: nfs-pv3
spec:capacity:storage: 200MaccessModes:- ReadWriteManynfs:server: 192.168.1.159path: "/home/k8s/redis/pv3"---
apiVersion: v1
kind: PersistentVolume
metadata:name: nfs-pv4
spec:capacity:storage: 200MaccessModes:- ReadWriteManynfs:server: 192.168.1.159path: "/home/k8s/redis/pv4"---
apiVersion: v1
kind: PersistentVolume
metadata:name: nfs-pv5
spec:capacity:storage: 200MaccessModes:- ReadWriteManynfs:server: 192.168.1.159path: "/home/k8s/redis/pv5"---
apiVersion: v1
kind: PersistentVolume
metadata:name: nfs-pv6
spec:capacity:storage: 200MaccessModes:- ReadWriteManynfs:server: 192.168.1.159path: "/home/k8s/redis/pv6"

创建Configmap

kubectl create configmap redis-conf --from-file=redis.conf
kubectl describe cm redis-confcat redis.conf
appendonly yes
cluster-enabled yes
cluster-config-file /var/lib/redis/nodes.conf
cluster-node-timeout 5000
dir /var/lib/redis
port 6379

创建Headless service

kubectl create -f headless-service.ymlcat headless-service.yaml
apiVersion: v1
kind: Service
metadata:name: redis-servicelabels:app: redis
spec:ports:- name: redis-portport: 6379clusterIP: Noneselector:app: redisappCluster: redis-cluster

创建Redis 集群节点

kubectl create -f  redis.yaml cat redis.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:name: redis-app
spec:serviceName: "redis-service"replicas: 6selector:matchLabels:app: redistemplate:metadata:labels:app: redisappCluster: redis-clusterspec:terminationGracePeriodSeconds: 20affinity:podAntiAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 100podAffinityTerm:labelSelector:matchExpressions:- key: appoperator: Invalues:- redistopologyKey: kubernetes.io/hostnamecontainers:- name: redisimage: redis:latestcommand:- "redis-server"args:- "/etc/redis/redis.conf"- "--protected-mode"- "no"resources:requests:cpu: "100m"memory: "100Mi"ports:- name: rediscontainerPort: 6379protocol: "TCP"- name: clustercontainerPort: 16379protocol: "TCP"volumeMounts:- name: "redis-conf"mountPath: "/etc/redis"- name: "redis-data"mountPath: "/var/lib/redis"volumes:- name: "redis-conf"configMap:name: "redis-conf"items:- key: "redis.conf"path: "redis.conf"volumeClaimTemplates:- metadata:name: redis-dataspec:accessModes: [ "ReadWriteMany" ]resources:requests:storage: 200M

问题

1 为什么使用 静态 存储pv redis 有状态部署 pod自动绑定 增加了 pvc,pvc与pv自动绑定了

他会根据 volumeClaimTemplates中的 spec 自动去匹配

2 有状态 最好使用 storgeclass 动态存储 每个 pod 自动创建 一个 pv 存储

静态PV

通过手动创建对应的PV(pv是集群级别的资源),需要创建一个PVC(pvc是namespace级别的资源),k8s会为pvc匹配满足条件的pv。

其中accessMode可以用来指定该PV的几种访问挂载方式:

  • ReadWriteOnce(RWO)表示该卷只可以以读写方式挂载到一个 Pod 内;
  • ReadOnlyMany( ROX)表示该卷可以挂载到多个节点上,并被多个 Pod 以只读方式挂载;
  • ReadWriteMany(RWX)表示卷可以被多个节点以读写方式挂载供多个 Pod 同时使用。

PV的状态为Available(可以用),另外我们还看到ReclaimPolicy字段,该字段表明对PV的回收策略,默认是Retain,即PV使用完后数据保留,需要手动进行清理,此外还有以下两种策略:

  • Recycle,即回收,这个时候会清除 PV 中的数据;
  • Delete,即删除,这个策略常在云服务商的存储服务中使用到,比如 AWS EBS

K8S会为PVC匹配满足条件的PV,以上示例中我们在PVC里面指定storageClassName 为manua,这个时候就会去匹配storageClassName同样为manual的PV,一旦发现合适的PV后,就可以绑定到该PV上。

PV有五种状态:

  1. Pending 表示目前该 PV 在后端存储系统中还没创建完成;
  2. Available 即闲置可用状态,这个时候还没有被绑定到任何 PVC 上;
  3. Bound 就像上面例子里似的,这个时候已经绑定到某个 PVC 上了;
  4. Released 表示已经绑定的 PVC 已经被删掉了,但资源还未被回收掉;
  5. Failed 表示回收失败。

PVC有三种状态:

  1. Pending 表示还未绑定任何 PV;
  2. Bound 表示已经和某个 PV 进行了绑定;
  3. Lost 表示关联的 PV 失联。
apiVersion: v1
kind: PersistentVolume
metadata:name: task-pv-volume # pv 的名字labels: # pv 的一些labeltype: local
spec:storageClassName: manualcapacity: # 该 pv 的容量storage: 10GiaccessModes: # 该 pv 的接入模式- ReadWriteOncehostPath: # 该 pv 使用的 hostpath 类型,还支持通过 CSI 接入其他 pluginpath: "/mnt/data"task-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: task-pv-claimnamespace: lab
spec:storageClassName: manualaccessModes:- ReadWriteOnceresources:requests:storage: 3GiapiVersion: v1
kind: Pod
metadata:name: task-demonamespace: lablabels:app: task-demo
spec:containers:- image: nginxname: task-demoports:- name: webcontainerPort: 80volumeMounts:- mountPath: '/usr/share/nginx/html'name: task-pvvolumes:- name: task-pvpersistentVolumeClaim:claimName: task-pvc-claim

动态PV

动态PV需要一些参数进行创建,这里通过StorageClass这个对象进行描述,在k8s中可以定义很多的storageclass

通过注释storageclass.kubernetes.io/is-default-class来指定默认的 StorageClass。这样新创建出来的 PVC 中的 storageClassName 字段就会自动使用默认的 StorageClass。其中provisioner字段为必填项,主要指定通过哪个voume plugin来创建PV

首先我们定义了一个 StorageClass。当用户创建好 Pod 以后,指定了 PVC,这个时候 Kubernetes 就会根据 StorageClass 中定义的 Provisioner 来调用对应的 plugin 来创建 PV。PV 创建成功后,跟 PVC 进行绑定,挂载到 Pod 中使用。

StatefulSet中使用动态PVC

对应StatefulSet来说,每个POD存储的volume数据是不一样的,而且相互关系是需要强绑定的。在这里就不能通过template来指定PV和PVC了,需要通过VloumeClaimTemplate。

通过定义这个template,就可以单独为每一个pod生成一个PVC,并绑定了PV,生成的PVC名字和POD是一样的,都是带有特定的序列

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: fast-rbd-scannotation:storageclass.kubernetes.io/is-default-class: "true"
provisioner: kubernetes.io/rbd # 必填项,用来指定volume plugin来创建PV的物理资源
parameters: # 一些参数monitors: 10.16.153.105:6789adminId: kubeadminSecretName: ceph-secretadminSecretNamespace: kube-systempool: kubeuserId: kubeuserSecretName: ceph-secret-useruserSecretNamespace: defaultfsType: ext4imageFormat: "2"imageFeatures: "layering"

参考文档

https://blog.51cto.com/leejia/2495558#h7

https://blog.csdn.net/zhutongcloud/article/details/90768390

记一次阿里云k8s部署-测试存储相关推荐

  1. 又到了上云时刻啦!!!阿里云 Docker部署SpringBoot项目 方便测试的部署方式

    又到了上云时刻啦!!!阿里云 Docker部署SpringBoot项目 方便测试的部署方式 部署思路: 具体步骤: 1.打成jar 2.上传到服务器 3.启动JDK容器 4.进入JDK 容器 启动 项 ...

  2. 阿里云k8s一键部署有状态StatefulSet nacos2.0.3

    阿里云k8s一键部署有状态StatefulSet nacos2.0.3 项目目录 centos 配置连接集群 kubectl 客户端执行k8s脚本 kubectl 执行结果,一键生成StatefulS ...

  3. 通过阿里云ecs部署k8s集群

    通过阿里云ecs部署k8s集群 1. 搭建环境 2. 安装步骤 禁用Selinux Restart Docker 此处仅有两台服务器,一台master节点,一台node节点,后期可按照步骤继续增加no ...

  4. 朱晔和你聊Spring系列S1E11:小测Spring Cloud Kubernetes @ 阿里云K8S

    有关Spring Cloud Kubernetes(以下简称SCK)详见https://github.com/spring-cloud/spring-cloud-kubernetes,在本文中我们主要 ...

  5. 阿里云K8S容器服务的使用

    使用阿里云k8s构建服务 一. 上传镜像 二. k8s运行 三. 服务配置导入 四. 服务路由 五. 节点亲和性和污点管理 一. 上传镜像 在阿里云控制台找到"容器镜像服务",开启 ...

  6. 在阿里云上部署生产级别Kubernetes集群

    阿里云是国内非常受欢迎的基础云平台,随着Kubernetes的普及,越来越多的企业开始筹划在阿里云上部署自己的Kubernetes集群. 本文将结合实战中总结的经验,分析和归纳一套在阿里云上部署生产级 ...

  7. 搭建前后端分离主流项目完整步骤——在线教育系统(阿里云服务器部署上线)

    前言: 需要源码评论或私我 项目技术栈如下图所示: 本次博客分前后端+部署服务器三个步骤来写 先来看看实现效果: 在线教育系统完整三步骤 前言: 一.后端技术栈 1.ssm+mysql: (1)map ...

  8. win系统的阿里云服务器部署IDEASpringBoot项目保姆级教程

    win系统的阿里云服务器部署SpringBoot项目保姆级教程 前言 配置阿里云服务器 配置环境 环境配置中的坑 还有别的坑的话,私信我我补充......毕竟配置是最基本的,还想咋样... jar包导 ...

  9. 阿里云centos7部署:nginx+uwsgi+django+vue

    基础环境 阿里云centos7 部署架构 nginx + uwsgi nginx提供静态文件服务和反向代理: uwsgi充当Web服务器: 部署过程 修改项目的配置文件,配置收集静态文件之后存放的目录 ...

最新文章

  1. 部署可扩展的目标检测管道:推理过程(上)
  2. “让技术做好事”,最特殊的创投在大湾区成立
  3. java linux urlencode_iOS urlEncode编码解码(非过时方法,已解决)
  4. 转载-ubuntu搭建Git 服务器
  5. 公安部全面查找改革开放以来失踪被拐儿童 失踪被拐儿童父母和疑似被拐人员快去采集DNA
  6. 安装程序无法继续 因为你的计算机安装了更新的,xp安装不了ie提示“安装了更新的Internet Explorer版本”怎么办...
  7. iptables之xtables_addons浅度解析
  8. Error dialog box generic entry point
  9. Cloudstack安装(二)
  10. php为什么获取不到id,微信小程序无法获取到unionId怎么办
  11. 【图解】透彻Java线程状态转换
  12. cacti 升级php,Cacti 升级备忘
  13. 如何建立一个利于SEO的网站
  14. 主域无法开机,备份域升级成主域操作
  15. element-ui下拉框使用value绑定id
  16. Luogu2467 SDOI2010 地精部落 DP
  17. java 文件读写 中文_java读写中文文件
  18. 2019_IJCAI_Adapting BERT for Target-Oriented Multimodal Sentiment Classification
  19. 自制一个SD/TF的读卡器
  20. 【唐诗学习】一、古诗概述

热门文章

  1. 关于Prim算法,自己的一些总结
  2. EtherCAT--01简介
  3. org.wltea.analyzer.lucene.IKAnalyzer(IK分词器)
  4. tomcat和HTTP(r equest response )
  5. Qt 快速利用qt designer Layout绘制GUI界面
  6. 神经网络方法研究及应用,基于神经网络的控制
  7. [译] 揭开 ARIA 的神秘面纱
  8. 计算机网络:BGP路由协议
  9. weinre安装及使用
  10. 海思hi3516dv300音频调节总结