• 实践记录:港澳居民居住证在西藏四川入住酒店?

    现在在内地工作生活的港澳居民可以申请有18位公民身份号码的港澳居民居住证,按照相关规定,可以享受在内地住宿旅馆的便利。实际上,这个“便利”每个地方有不同的操作。

    在沿海省份,实测港澳居民居住证基本可以顺利入住“内宾”酒店。在青海省住了几家内宾酒店,通常前台看到证件的第一反应是说不能接待,但是让前台咨询负责人或者属地警务站之后,基本都可以办理入住,可以在机器上刷脸。

    这次骑行川藏线,了解到西藏可能比较敏感,但是网上搜不到信息,所以直接出发测试,基本上只有林芝和拉萨要求必须住有涉外资质的酒店,其他地方有些波折但总体顺利。在这里记录一下供参考。

    (更多…)

  • 操作记录: 怎样带流浪猫做绝育

    问题与难点

    我妈习惯了投喂小区的流浪猫,有几只猫已经成为我们家常客了,后来也约等于在我家院子里定居了。

    从新闻报道等可以了解到,投喂流浪猫其实会间接破坏生态。猫会杀死很多小动物(鸟类等),而且猫的生育能力强,投喂流浪猫,它就有更多的食物源去生小猫,直到所在区域的食物源不足以支持更多的猫生活。

    理论上,不投喂流浪猫是正确的做法。但是猫咪这么可爱,它们喵喵叫要吃的能不给吗? 毕竟绝对理性的话,让人类从地球上消失才是解决生态问题的根本方法。

    因此,给猫做绝育应该是比较可行的方法了。

    网上也找到了一些操作指南:
    https://www.neighborhoodcats.org/how-to-tnr/getting-started/the-7-steps-of-tnr
    (更多…)

  • Elasticsearch 删除 RED state index

    问题

    Openshift v4 中的 logging 出现了某些问题,导致 Elasticsearch 处于 red state, 日志无法写入。

    解决方法

    1. 进入到 ES Pod 中,查看健康状态,发现是 red 的,有一些 unassigned shard.
    [cc lang=”text”]
    $ oc exec -it elasticsearch-cdm-xxxx-1-yyyy-zzzz -n openshift-logging bash
    bash-4.2$ health
    Tue Nov 10 06:19:00 UTC 2020
    epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
    xxxxx 06:19:00 elasticsearch red 3 3 578 289 0 0 202 0 – 74.1%
    [/cc]

    2. 查看有哪些 unassigned shards, 以及 unassigned 的原因。集群刚刚恢复的时候,shard 的状态会是 CLUSTER_RECOVERED,但不应该持续很久。这里的状态一直停留在 CLUSTER_RECOVERED,应该是什么地方出现了问题。
    [cc lang=”text”]
    bash-4.2$ $curl_get “$ES_BASE/_cat/shards?h=index,shard,prirep,state,unassigned.reason” | grep UNASSIGNED
    .xxxxxxxxxx.2020.10.14 1 p UNASSIGNED CLUSTER_RECOVERED
    .xxxxxxxxxx.2020.10.14 1 r UNASSIGNED CLUSTER_RECOVERED
    .xxxxxxxxxx.2020.10.14 2 p UNASSIGNED CLUSTER_RECOVERED
    [/cc]

    3. 查看 Unassigned 的原因。数据没了。
    [cc lang=”text”]
    bash-4.2$ $curl_get “$ES_BASE/_cluster/allocation/explain?pretty”
    “can_allocate” : “no_valid_shard_copy”,
    “allocate_explanation” : “cannot allocate because a previous copy of the primary shard existed but can no longer be found on the nodes in the cluster”,
    [/cc]

    4. 一个简单粗暴的移除 red state 的方法是把 red state 的 index 删除掉,这样 Elasticsearch 可以继续接受到日志,不至于影响新进来的日志。
    [cc lang=”text”]
    $ curl -XDELETE ‘localhost:9200/index_name/’
    [/cc]

    据了解,更靠谱的方法应该是,relocate 这个 shard, 这样不至于丢失整个 index 的数据。然而我没有尝试。

    (更多…)

  • 2020青海湖骑行计划: 银川, 西宁, 青海湖

    之前跟同学说今天要来一次长途骑行,一直没有决定下来去哪里。8月的某一天,同学说之前有人国庆去过青海湖骑行,实际不会太冷。于是就定下来国庆去青海湖了。

    计划 9.26 出发,请几天假错开国庆高峰。国庆前后的机票不便宜,在携程上搜到 北京大兴-银川-西宁 的中转票,全程含税590元,银川机场提供中转住宿和机场大巴票,能多玩一个地方还能省点机票钱,就它了。

    按照网上的经验,结合我骑得慢的实际情况,制定了以下计划:

    青海湖骑行计划

    9/26 北京->银川, 银川停留1天。
    9/27 银川->西宁, 西宁停留1晚,
    9/28 上午,取车。下午骑行45km至【湖东种羊场】,在【湖东种羊场】住宿1晚。
    9/29 骑行70km至【江西沟】,住宿1晚。
    9/30 骑行48km至【黑马河】,住宿2晚。(10/1白天坐车去茶卡盐湖,下午回到黑马河住宿)
    10/2 骑行115km至【刚察】,住宿1晚。
    10/3 骑行84km回到【西海镇】,住宿1晚。
    10/4 回到西宁,停留1晚。
    10/5 各回各家

    顺时针骑行,爬坡较为轻松,而且靠湖边更近。先易后难,适应高原。原计划是这样的。


    (更多…)

  • “kubectl apply -f” fail with “The xxxx is invalid: metadata.resourceVersion: Invalid value: 0x0: must be specified for an update”

    Issue

    When running “kubectl apply” against a Resource in Kubernetes, it fails with below error.
    [cc lang=”text”]
    The is invalid: metadata.resourceVersion: Invalid value: 0x0: must be specified for an update
    [/cc]
    (更多…)

  • Kubernetes Operators 入门笔记

    为什么需要 Kubernetes Operator?

    在查阅 Kubernetes Operators 由来的时候,看到阿里云的这篇文章[8]. 这篇文章的作者之一邓洪超是下文学习的 etcd operator 的作者之一。这篇文章讲述了 Operator 的历史,写出了历史大片的感觉,值得一看。

    按照我的理解,Operator 的就是一个运维人员,只是这个运维人员是软件而不是人类。 对于无状态的应用,像是 web server, 其实用 k8s 本身的 deployment 就足够了,一个 pod 坏了,自动部署一个新的 pod, 又有弹性又高可用。但是对于一些稍微复杂的应用,尤其是有状态,有特定拓扑的应用,就需要特定的逻辑才能管理起来。 比如 etcd, 如果有一半以上的节点挂了,那么就会出现 quorum lost, 集群无法工作。还是 etcd, 里面的数据需要定期备份,万一整个集群挂了,也能及时地恢复。 这些操作可以通过人类实现,也可以通过软件实现,Operator 就是这样的软件,它会自动管理 k8s 上一个特定的复杂应用。

    于是,Operator 也成为了应用软件在 Kubernetes 上的一种标准化交付方式。应用的开发者可以定义好如何运维这个应用,用户想用某个应用,只需要安装上相应的 Operator,那么 Operator 就会自动完成整个应用生命周期的管理,包括安装、升级、备份、恢复等等。

    如果把饼画得大一点,在 k8s 里,下有管理 k8s 节点的 Operator, 上有管理应用的 Operator, 那么这整个平台都是自动管理的,可以做到免运维,这很云计算。
    (更多…)

  • 用 Jenkins 做一些自动化工作

    目测现在的团队喜欢用 Jenkins 来处理一些自动化的工作。由于需要在前人的基础上做一些东西,于是我也用了一下 Jenkins. Jenkins 的官方文档有基本的教程,这里记录一些我用到的地方和遇到的问题。
    (更多…)

  • Jenkins: WorkflowScript: 1: unable to resolve class Declarative

    TLDR: The line “Jenkinsfile (Declarative Pipeline)” in the Jenkins get started page is just a comment, don’t paste it in the Jenkins file.

    (更多…)

  • rpm -V 没有检测到某些 missing 文件

    通常,我们会用 rpm -V 来检查某个 rpm 包的完整性。例如:
    [cc lang=”text”]
    # mv /usr/share/zoneinfo/zone1970.tab /tmp/
    # rpm -V tzdata-2019c-1.el8.noarch
    missing /usr/share/zoneinfo/zone1970.tab
    [/cc]

    不过,我遇到的情况是,ca-certificates 这个 rpm 包对应的 /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt 文件被意外移除后,用 rpm -V ca-certificates 这个命令没有检测到它 missing.
    [cc lang=”text”]
    # rpm -ql ca-certificates | grep ca-bundle.trust.crt
    /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt
    /etc/pki/tls/certs/ca-bundle.trust.crt
    # mv /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt /tmp/
    # rpm -V ca-certificates | wc -l
    0
    [/cc]

    查看 rpm 包的 ca-certificates.spec 可以看到,extracted 目录下的文件是后期生成了,在 %files 下,会用 %ghost 来标记 extracted 目录下的文件。于是 rpm -ql 能看到这些文件属于这个 rpm 包,但是 rpm -V 的时候不会校验这些文件。
    [cc lang=”text”]
    # files extracted files
    %ghost %{catrustdir}/extracted/pem/tls-ca-bundle.pem
    %ghost %{catrustdir}/extracted/pem/email-ca-bundle.pem
    %ghost %{catrustdir}/extracted/pem/objsign-ca-bundle.pem
    [/cc]

    参考:
    http://ftp.rpm.org/max-rpm/s1-rpm-inside-files-list-directives.html