Browsed by
作者:东方皓

kubernetes概念

kubernetes概念

cluster

cluster是计算、存储、和网络资源的集合,kubernetes利用这些资源运行各种基于容器的应用。

master

master是cluster的大脑,它的主要职责是调度,即决定应用放在哪运行。为了实现高可用,可以运行多个master。

node

node的职责是运行容器应用,node由master管理,node负责监控并汇报容器的状态,并根据master的要求管理容器的生命周期。

pod

pod是kubernetes的最小工作单元。每个pod包含一个或多个容器,pod中的容器会作为一个整体被master调度到一个node上运行。

pod的作用

方便管理关系密切的容器
方便通信和资源共享,pod中所有容器共享namespace,ip,port
Kubernetes运行容器(Pod)与访问容器(Pod)这两项任务分别由 Controller 和 Service 执行

controller

kubernetes通常不会直接创建pod,而是通过controller来管理pod,如定义pod有几个副本,在什么样的node上运行等等。

controller分类

deployment,是最常见的是controller,它可以管理pod的多个副本,并确保按预期状态运行。
job用于运行结束就删除的应用。而其他Controller中的pod通常是长期持续运行
statefuleset,它能够保证pod的每个副本在整个生命周期中的名称是不变的,同时保证副本按照固定的顺序启动、更新或者删除。
daemonset,它通常用于运行daemon
ReplicaSet 实现了 Pod 的多副本管理

service

kubernetes service定义了外界访问一组pod的方式。service有自己的ip和port,并为pod提供了负载均衡。

namespace

将多用户或项目组创建的controller,pod等资源分开,每个cluster就是一个namespace,不同的namespace的资源是完全隔离的。
Kubernetes默认创建了两个Namespace。

DNS查询过程

DNS查询过程

假设

www.abc.com

的主机要查询

www.xyz.abc.com

的服务器ip地址。

知识点

  1. hosts文件:以静态映射的方式提供IP地址与主机名的对照表,类似ARP表

  2. 域:abc.com是一个域,它可以划分为多个区域,如abc.com和xyz.abc.com

步骤

递归查询

第一步:在hosts静态文件、DNS解析器缓存中查找某主机的ip地址
第二步:上一步无法找到,去DNS本地服务器(即域服务器)查找,其本质是去区域服务器、服务器缓存中查找
第三步:本地DNS服务器查不到就根据‘根提示文件’向负责顶级域‘.com’的DNS服务器查询
第四步:‘根DNS服务器’根据查询域名中的‘xyz.com’,再向xyz.com的区域服务器查询
第五步:

www.xyz.abc.com

的DNS服务器直接解析该域名,将查询到的ip再原路返回给请求查询的主机

迭代查询

第一步:在hosts静态文件、DNS解析器缓存中查找某主机的ip地址
第二步:上一步无法找到,在DNS本地服务器(即域服务器)查找所有本层次的区域服务器
第三步:本地DNS服务器查不到就查询上一层次的所有区域服务器,以此类推直至根域名DNS服务器‘.’
第四步:到达根域名服务器后又向下查询,直至查到结果为止。

迭代查询与递归查询结合

递归查询需要经过逐层查询才能获得查询结果,当查询具有许多层次的DNS结构时效率很低,所以一般采用两者相结合的查询方式。

第一步:在hosts静态文件、DNS解析器缓存中查找某主机的ip地址
第二步:上一步无法找到,去DNS本地服务器(即域服务器)查找,其本质是去区域服务器、服务器缓存中查找
第三步:本地DNS服务器查不到就根据‘根提示文件’向负责顶级域‘.com’的根DNS服务器查询
第四步:根DNS服务器直接将其区域DNS服务器的ip地址返回给本地服务器,而不用再向xyz.com的区域服务器查询。
第五步:本地DNS服务器将结果返回给请求的主机

Python中元组(tuple)用法总结

Python中元组(tuple)用法总结

一、tuple也是一个class,是不可变的list类型,不可以增删改。

创建:

tup1 = ('physics', 'chemistry', 1997, 2000);
tup2 = (1, 2, 3, 4, 5 );
tup3 = "a", "b", "c", "d";

访问:(与list一样)tup1[1:5];

修改:不可以修改,只能增加新的部分;

tup3 = tup1 + tup2;
print tup3;

二、任意无符号的对象,以逗号隔开,默认为元组,如下实例:

a=1,2,3,'e'

a=(1,2,3,'e').

三、Python元组包含了以下内置函数(与list差不多的函数)

  1. cmp(tuple1, tuple2):比较两个元组元素。
  2. len(tuple):计算元组元素个数。
  3. max(tuple):返回元组中元素最大值。
  4. min(tuple):返回元组中元素最小值。
  5. tuple(seq):将列表转换为元组。

四、tuple的方法:

  1. count():查找元素在tuple中出现的次数。
  2. index():查找元素的第一个索引值。

五、Tuple 是不可变 list。 一旦创建了一个 tuple 就不能以任何方式改变它。

  1. Tuple 与 list 的相同之处

定义 tuple 与定义 list 的方式相同, 除了整个元素集是用小括号包围的而不是方括号。
Tuple 的元素与 list 一样按定义的次序进行排序。 Tuples 的索引与 list 一样从 0 开始, 所以一个非空 tuple 的第一个元素总是 t[0]。
负数索引与 list 一样从 tuple 的尾部开始计数。
与 list 一样分片 (slice) 也可以使用。注意当分割一个 list 时, 会得到一个新的 list ;当分割一个 tuple 时, 会得到一个新的 tuple。

  1. Tuple 不存在的方法

您不能向 tuple 增加元素。Tuple 没有 append 或 extend 方法。
您不能从 tuple 删除元素。Tuple 没有 remove 或 pop 方法。
然而, 您可以使用 in 来查看一个元素是否存在于 tuple 中。

  1. 用 Tuple 的好处

Tuple 比 list 操作速度快。如果您定义了一个值的常量集,并且唯一要用它做的是不断地遍历它,请使用 tuple 代替 list。
如果对不需要修改的数据进行 “写保护”,可以使代码更安全。使用 tuple 而不是 list 如同拥有一个隐含的 assert 语句,说明这一数据是常量。如果必须要改变这些值,则需要执行 tuple 到 list 的转换。

  1. Tuple 与 list 的转换

Tuple 可以转换成 list,反之亦然。内置的 tuple 函数接收一个 list,并返回一个有着相同元素的 tuple。而 list 函数接收一个 tuple 返回一个 list。从效果上看,tuple 冻结一个 list,而 list 解冻一个 tuple。

PHP验证当前时间是否在指定时间段

PHP验证当前时间是否在指定时间段

/*
  验证当前时间是否在某个时间区间内
  @param string $startTime 开始时间 如00:00:00
  @param string $endTime 结束时间 如23:00:00
  @return boolean 在时间区间内返回TRUE 不在时间区间内返回FALSE
*/
function timeSection($startTime='00:00:00',$endTime='23:59:59') {
    //获取当天的日期
    $dateStr = date('Y-m-d',time());
    //定义开始时间和结束时间
    $sTime = strtotime($dateStr.$startTime);
    $eTime = strtotime($dateStr.$endTime);
    $nowTime = time();
    if($nowTime>=$sTime && $nowTime<=$eTime) {
        return true;
    } else {
        return false;
    }
}
WordPress定时任务

WordPress定时任务

function my_activation() {
    if ( !wp_next_scheduled( 'my_hourly_event' ) ) {
        wp_schedule_event(time(), 'hourly', 'my_hourly_event');
    }
}
add_action('wp', 'my_activation');
function do_this_hourly() {
    //填写 PHP 代码,下面举例
    wp_mail( "sp91@qq.com", "云落,这是一个测试邮件! ", "这是测试邮件标题", "这是测试邮件内容");
}
add_action('my_hourly_event', 'do_this_hourly');
WordPress让登录用户选择跳转到哪里

WordPress让登录用户选择跳转到哪里

// Fields for redirect
function custom_login_fields() {
    ?>
            <p>
                <label>
                    <strong>Choose your location: </strong>
                    <select name="login_location">
                        <option value="">Select …</option>
                        <option value="<?php bloginfo('url'); ?>#banking">Banking</option>
                        <option value="<?php bloginfo('url'); ?>#insurance">Insurance</option>
                        <option value="<?php echo get_permalink(2); ?>">Securities</option>
                    </select>
                </label>
            </p><br/>
        <?php
}
// Redirect function
function location_redirect() {
    $location = $_POST['login_location'];
    wp_safe_redirect($location);
    exit();
}
// Add fields to the login form
add_action('login_form','custom_login_fields');
// Make sure the redirect happens only if your fields are submitted
if ( (isset($_GET['action']) && $_GET['action'] != 'logout') || (isset($_POST['login_location']) && !empty($_POST['login_location'])) ) 
        add_filter('login_redirect', 'location_redirect', 10, 3);
WordPress短代码实现倒计时显示功能

WordPress短代码实现倒计时显示功能

function content_countdown($atts, $content = null) {
    extract(shortcode_atts(array(
             'month' => '',
             'day'   => '',
             'year'  => ''
            ), $atts));
    $remain = ceil((mktime( 0,0,0,(int)$month,(int)$day,(int)$year) - time())/86400);
    if( $remain > 1 ) {
        return $daysremain = "<div class=\"event\">Just <b>($remain)</b> days until content is available</div>";
    } else if($remain == 1 ) {
        return $daysremain = "<div class=\"event\">Just <b>($remain)</b> day until content is available</div>";
    } else {
        return $content;
    }
}
add_shortcode('cdt', 'content_countdown');
WordPress后台添加操作指引

WordPress后台添加操作指引

add_action( 'admin_enqueue_scripts', 'my_admin_enqueue_scripts' );
function my_admin_enqueue_scripts() {
    wp_enqueue_style( 'wp-pointer' );
    wp_enqueue_script( 'wp-pointer' );
    add_action( 'admin_print_footer_scripts', 'my_admin_print_footer_scripts' );
}
function my_admin_print_footer_scripts() {
    $pointer_content = '<h3>云落的通知</h3>';
    $pointer_content .= '<p>这是一个通知</p>';
    ?>
           <script type="text/javascript">
           //<![CDATA[
    jQuery(document).ready( function($) {
        $('#menu-appearance').pointer( {
            content: '<?php echo $pointer_content; ?>',
                        position: 'left',
                        close: function() {
                // Once the close button is hit
            }
        }
        ).pointer('open');
    }
    );
    //]]>
    </script>
        <?php
}