快速入门

实验:通过服务自动发现的redis主从

难点:

1,服务的自动发现,即如何确定coreDNS 已生效

2,redis的主从验证

遇到的问题:

1,Can't handle RDB format version 9

解决:一般是低版本无法兼容高版本的 rdb 导致的。要求删除 dump.rdb文件,再启动 redis-server。 但是pod 中命令不足,所以自己新建镜像使用。

2,使用k8s 起的pod 和docker 起的容器,在容器内部 /etc/resolve.cnf内的ns 不同,docker 起的容器和系统保持一致,但是K8S 起的pod 使用的是CoreDNS 的ns

(即pod 内与外网隔绝,使用ip 也不行,这句可能不对,未查资料,仅现有环境测试)

验证k8s服务自动发现

一般k8s搭建正常后服务也正常

 kubectl   get   po  -n  kube-system
NAME READY STATUS RESTARTS AGE
coredns-5c98db65d4-j2925 1/1 Running 0 61m
coredns-5c98db65d4-k2rcj 1/1 Running 0 61m
etcd-k8s-master 1/1 Running 0 60m
kube-apiserver-k8s-master 1/1 Running 0 60m
kube-controller-manager-k8s-master 1/1 Running 0 60m
kube-flannel-ds-amd64-6rq62 1/1 Running 0 60m
kube-flannel-ds-amd64-ctmdz 1/1 Running 0 59m
kube-proxy-kmgc5 1/1 Running 0 61m
kube-proxy-ss8jr 1/1 Running 0 59m
kube-scheduler-k8s-master 1/1 Running 0 60m

1,验证k8s CoreDNS搭建正常

## 起nginx 容器和服务测试

cat  tt-nginx.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
app: nginx ##起具有curl 和nslookup 工具的镜像测试
cat curl-utils.yml
apiVersion: v1
kind: Pod
metadata:
name: curl-util
spec:
containers:
- name: curl-util
image: radial/busyboxplus:curl
command:
- sh
- -c
- while true ; do sleep 1 ;done ## 进入curl 工具容器测试
nslookup nginx curl nginx:80

2,redis 简单主从和哨兵

#根据redis 镜像制作redis-slave  

cat  run.sh
#!/bin/bash
if [[ ${GET_HOSTS_FROM:-dns} == "env" ]]; then
redis-server --slaveof ${REDIS_MASTER_SERVICE_HOST} 6379
else
redis-server --slaveof redis-master 6379
fi ############################# cat Dockerfile
FROM redis
COPY run.sh /
RUN chmod +x /run.sh
ENTRYPOINT ["/run.sh"] docker build -t redis-slave-tt . --------------------------------------------------------------- ## redis-master 的RC和service cat redis-master.yml
apiVersion: v1
kind: ReplicationController
metadata:
name: redis-master
labels:
name: redis-master
spec:
replicas: 1
selector:
name: redis-master
template:
metadata:
labels:
name: redis-master
spec:
containers:
- name: master
image: redis
ports:
- containerPort: 6379 ---
apiVersion: v1
kind: Service
metadata:
name: redis-master
labels:
name: redis-master
spec:
ports:
- port: 6379
targetPort: 6379
selector:
name: redis-master ---------------------------------------------------- #redis-slave 的RC
cat redis-slave-controller.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: redis-slave
labels:
name: redis-slave
spec:
replicas: 2
selector:
name: redis-slave
template:
metadata:
labels:
name: redis-slave
spec:
containers:
- name: slave
image: redis-slave-tt
imagePullPolicy: Never
env:
- name: GET_HOSTS_FROM
value: dns
# If your cluster config does not include a dns service, then to
# instead access an environment variable to find the master
# service's host, comment out the 'value: dns' line above, and
# uncomment the line below.
#value: env
ports:
- containerPort: 6379 ##
注意:因为K8S 使用镜像是本地的,所以必须添加 imagePullPolicy: Never 属性
环境变量使用env 也可以 ############
哨兵配置
生成本地镜像
cat sentinel.conf
port 8332
daemonize no sentinel deny-scripts-reconfig yes sentinel monitor mymaster redis-master 6379 2 sentinel config-epoch mymaster 0
# Generated by CONFIG REWRITE
dir "/data"
sentinel leader-epoch mymaster 0
sentinel current-epoch 0 cat Dockerfile
FROM redis
COPY sentinel.conf /etc/sentinel.conf
CMD [ "redis-sentinel", "/etc/sentinel.conf" ]
EXPOSE 8332 生成镜像
docker build -t redis-sentinel . 哨兵的服务配置
cat redis-sentinel.yml
apiVersion: v1
kind: ReplicationController
metadata:
name: redis-sentinel
labels:
name: redis-sentinel
spec:
replicas: 1
selector:
name: redis-sentinel
template:
metadata:
labels:
name: redis-sentinel
spec:
containers:
- name: redis-sentinel
image: redis-sentinel
imagePullPolicy: Never
ports:
- containerPort: 8332 ---
apiVersion: v1
kind: Service
metadata:
name: redis-sentinel
labels:
name: redis-sentinel
spec:
ports:
- port: 8332
targetPort: 8332
selector:
name: redis-sentinel kubectl create -f redis-sentinel.yml 查看 kubectl get po -o wide
进入容器查看
kubectl exec -it redis-sentinel-npnn6 /bin/sh redis-cli -p 8332 # Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=10.108.41.72:6379,slaves=2,sentinels=1

其他

镜像拉取策略:

containers:

- name: uses-private-image

image: $PRIVATE_IMAGE_NAME

imagePullPolicy: Always

command: [ "echo", "SUCCESS" ]

Always 总是拉取镜像,每次下载最新的镜像

IfNotPresent 只有当本地没有的时候才去下载镜像

Never 只使用本地镜像,从不拉取,即使本地没有

如果省略imagePullPolicy 镜像tag为 :latest 策略为always ,否则 策略为 IfNotPresent

一些命令

kubectl cluster-info

kubectl -s https://172.20.7.132:6443 get componentstatuses

kubectl -s https://172.20.7.132:6443 get nodes

kubectl delete replicationcontroller xx xxx xx

kubectl delete service xxx xxx xx

POD

常用命令

kubectl get pod redis-master-v8zjx -o yaml

kubectl describe pod curl-util

kubectl delete pod pod-name

kubectl delete pod --all 批量删除全部pod

拉取私有镜像仓库需要的登陆;有2种方式:

1,所有node手工docker login

2 ,POD中添加Image Pull Secret 用于验证,

操作:





系统管理员设置全局的 image pull secret ,创建pod 时自动添加上

pod的启动命令

docker run 运行容器时没有指定容器的启动命令,容器则使用默认的Docker 镜像的启动命令。一般通过dockerfile 的CMD 和 ENTRYPOINT设置。

CMD命令可以覆盖,docker run 指定的启动命令会把CMD 命令覆盖。ENTRYPOINT设置的命令是一个入口,docker 指定的启动命令作为参数传递给ENTRYPOINT设置的命令,而不是进行替换。



pod的环境变量

设置容器运行时的环境变量

env:
- name: PAREMETER_1
value: value_1
- name: PAREMETER-2
value: value_2

pod的YAML 文件

pod的网络

pod的重启策略

通过pod定义的.spec.restartPolicy设置:

pod 的状态和生命周期

使用kubectl describe pod pod-name 查看容器状态





生命周期的回调函数

PostStart :容器创建成功后调用

PreStop:容器终止前调用该回调函数

自定义检查pod

检查pod 是否健康,默认情况下只会检查容器是否正常运行,容器运行不代表应用正常运行

*调度pod

pod 分配到哪个node

支持的过滤函数

选择:

通过node 的label 选择

使用命令

kubectl label nodes kube-node- env=test

创建pod 时选择Node

nodeSelector:

env: test

或通过Node Name 直接指定:

nodeName: kube-node-1

事件查询

kubectl get event

kubectl describe pod my-pod

日志查询

kubectl logs pod-name container

远程连接容器

kubectl exec my-pod -- date pod 只有一个容器 不需要指定容器

直接进入 kubectl exec -it my-pod /bin/bash

k8s实战--redis主从--guestbook的更多相关文章

  1. Redis实战——redis主从备份和哨兵模式实践

    借鉴:http://redis.majunwei.com/topics/sentinel.html     https://blog.csdn.net/u011784767/article/detai ...

  2. 项目实战11—企业级nosql数据库应用与实战-redis的主从和集群

    企业级nosql数据库应用与实战-redis 环境背景:随着互联网2.0时代的发展,越来越多的公司更加注重用户体验和互动,这些公司的平台上会出现越来越多方便用户操作和选择的新功能,如优惠券发放.抢红包 ...

  3. Redis主从实战

    为了提升redis高可用性,除了备份redis dump数据之外,还需要创建redis主从架构,可以利用从将数据库持久化,(我们所说的数据持久化将是将数据保存到写磁盘上,保证不会因为断电等因素丢失数据 ...

  4. redis单点、redis主从、redis哨兵sentinel,redis集群cluster配置搭建与使用

    目录 redis单点.redis主从.redis哨兵 sentinel,redis集群cluster配置搭建与使用 1 .redis 安装及配置 1.1 redis 单点 1.1.2 在命令窗口操作r ...

  5. puppet工作原理及部署redis主从篇

    一.简介 1.国际惯例什么是puppet puppet是一种Linux.Unix.windows平台的集中配置管理系统,使用自有的puppet描述语言,可管理配置文件.用户.cron任务.软件包.系统 ...

  6. redis 主从、哨兵、集群

    出处: redis主从复制和哨兵 Redis集群方式共有三种:主从模式,哨兵模式,cluster(集群)模式 一.Redis主从复制 主从复制:主节点负责写数据,从节点负责读数据,主节点定期把数据同步 ...

  7. kubernetes部署redis主从高可用集群

    1.redis主从高可用集群结构 2.k8s部署有状态的服务选择 对于K8S集群有状态的服务,我们可以选择deployment和statefulset statefulset service& ...

  8. Redis系列之(二):Redis主从同步,读写分离

    1. Redis主从同步 Redis支持主从同步.数据可以从主服务器向任意数量的从服务器上同步,同步使用的是发布/订阅机制. 2. 配置主从同步 Mater Slave的模式,从Slave向Maste ...

  9. Redis 主从配置和参数详解

    安装redis 下载redis wget http://download.redis.io/releases/redis-3.0.7.tar.gz 解压redis tar -xvf redis-.ta ...

随机推荐

  1. mycat是什么?你是怎么理解的?你们公司分库分表的分片规则是什么?搭建mycat环境常用的配置文件有哪些?

    1.mycat是什么? 国内最活跃的.性能最好的开源数据库分库分表中间件 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务.ACID.可以替代MySQL的加强版数据库 一个可以视为MySQL集 ...

  2. 【深度学习笔记】第 2 课:Logistic 多项式回归法

    """Softmax.""" scores = [3.0, 1.0, 0.2] import numpy as np def softmax ...

  3. 匿名函数、委托和Lambda表达式

    匿名函数 匿名函数(Anonymous Function)是表示“内联”方法定义的表达式.匿名函数本身及其内部没有值或者类型,但是可以转换为兼容的委托或者表达式树类型(了解详情).匿名函数转换的计算取 ...

  4. Linux ulimit 命令 限制系统用户对 shell 资源的访问

    ulimit命令用来限制系统用户对 shell 资源的访问,常见用法如下: [root@MongoDB ~]# ulimit -a // 查看当前所有的资源限制 [root@MongoDB ~]# u ...

  5. effective_io_concurrency很重要的一个参数

    effective_io_concurrency (integer) Sets the number of concurrent disk I/O operations that PostgreSQL ...

  6. 小记-------linux scp 远程拷贝命令

    //phoenix-4.10.0-HBase-1.2-server.jar  要拷贝的文件或文件夹 //root  当前用户   //192.148.21.1 远程机器路径, 也可以是域名. // $ ...

  7. 搜索专题:问题 E: 挑战ACM迷宫

    这是往年校赛的一道题,最开始做这道题的时候还没有系统的学习过搜索,用了C语言学的回溯法尝试,毫无疑问的TLE: 学习了DFS之后,自己的剪枝功力不够,又是TLE,最后学了BFS之后,哇,终于做出来了, ...

  8. 字符集详解 ASCII码、Unicode、UTF-8 (转)

    认识字符集 对于计算机而言,它仅认识两个0和1,不管是在内存中还是外部存储设备上,我们所看到的文字.图片.视频等等“数据”在计算机中都是已二进制形式存在的.不同字符对应二进制数的规则,就是字符的编码. ...

  9. 如何减少程序间的耦合度?_DI与接口

    spring 开发提倡接口编程,配合DI技术可以更好的减少层(程序)与层(程序)之间的解耦合例子说明:  任务:要求:        1.打印机依赖纸张和墨盒        2.纸张有A4和B5两种  ...

  10. jstl用法 简介

    <c:choose> <c:when test="${salary <= 0}"> 太惨了. </c:when> <c:when t ...