kubernetes 快速安装

这段时间我一直在折腾kubernetes,我讨厌了在不同的电脑上不断的部署,撤销,部署的循环了。 并且,将尽可能的将所有docker化的服务部署到kurbernetes上。

环境准备

ubuntu 16.04 x86_64

安装

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
# Install docker if you don't have it already.
apt-get install -y docker.io
apt-get install -y kubelet kubeadm kubectl kubernetes-cni

配置

master上运行,其他节点直接join就可以

kubeadm init --api-advertise-addresses=192.168.228.129

ip地址为本地的可访问外网的地址

经过长时间的,坚持不懈的努力,终于在某天,良心发现,99%的梯子能力+1%的运气, 成功下载了所有的镜像,并运行起来了

kubernetes的各种坑开始

kubectl get pods -n kube-system

无法启动

8080端口是否被占用了?

dns 的pod一直无法启动

上述的配置中不含网络配置,网络需要另外安装关于网络的插件,目前有weave和calico等, 据说calico逼格比较高,所以选择calico开始

calico 各种坑开始

  • calico yaml的选择
    1. 上述的安装使用的是kubeadm安装,因此,选择使用kubeadm/calico.yaml配置
    2. /etc/kubernetes/manifests/etcd.json中关于etcd的配置,默认”–listen-client-urls” 为 “http://127.0.0.1:2379“, “–advertise-client-urls”为”http://127.0.0.1:2379“, 至少修改为外网可访问的,幸运的是,不用重启,过一会kubernetes会自动加载这个
    3. 删除下载下来的配置中的etcd的配置和etcd服务的配置
    4. 修改下载下来的配置中的etcd的地址为kubeadm启动的etcd的地址,没记错的话,直接搜索6666就可以找到这个了
    5. 可能是防火墙影响,一直pull不下来,然后一直重拾
  • calico pool 未知命令( 这个已经不需要了)
    1. 下载的calico.yaml可能比较老,使用最新的版本
    2. 老版本的pool命令已经需要了,新版本中是apply命令
    3. 如果不想更新calico的配置的话,自己pull一个老版本的,然后打tag
    4. 修改calico配置中的calico/ctl的版本为较老的版本
    5. 这个非常坑,我尝试了十几次才找到可以支持的,结果发现官网中的kubeadm/calico.yaml更新了
  • kube-dns 出现 2/3 runing的状态

    基本上,上述pool的问题解决了之后,这个一般不会出现,但不幸,我碰到了, 重启下docker服务试试?

  • calico-* 等在node加入后的各种不正常现象
    1. 要求各节点的主机名称不能相同,(修改/etc/hosts,/etc/hostname等文件)
    2. etcd监听的为127.0.0.1,修改( 上述提到过)
    3. calico的yaml中修改etcd的地址,重新create,未试过apply
    4. 去掉各节点的docker启动服务参数中的dns为127.0.0.1(简单的理解,这个dns要可以解析各个自节点的主机名)
    5. 重启docker服务试试?

webui 安装

满怀信心的打开http://127.0.0.1:8080/ui/ , 结果无法访问。webui 需要安装才能使用

kubectl create -f https://rawgit.com/kubernetes/dashboard/master/src/deploy/kubernetes-dashboard.yaml

经过上述坑,kubernetes终于算是比较正常了,可以运行了

org2blog 发布时出现Multibyte text in HTTP request的错误

环境: window, emacs 25.1(不清楚是否是最终的版本)

症状: publish的时候出现Multibyte text in HTTP request的错误

修改方法:

emacs 25.1 自带的url-http.el 搜索 Bug#23750, 然后注掉紧跟着的三行,如:

;; Bug#23750
;(unless (= (string-bytes request)
; (length request))
; (error “Multibyte text in HTTP request: %s” request))

为了修改bug而导致的bug?

相同的版本,连接到https的时候,出现gnu-tls等错误

解决方法:

emacs 25 有一个30多M的deps, 下载后覆盖相同目录即可。别忘了重启emacs有效,话说windows上不关闭emacs是没办法覆盖成功的(文件正在被使用)。 不知道多了这么多的deps,是否有更多的可玩性,里面有很多sh文件,但竟然没有bash或者sh,那….

ceph 安装记录

这个是我再ubuntu 16.04上安装ceph的记录。以便后续参考

前期准备

  1. 两台以上的主机(我用了两台, node1作为mon,node2作为osd)
  2. 互相可通过主机名访问(ping 主机名)
  3. 建议修改hostname, hosts等,不要用反人类的主机名
  4. 所有电脑上开通含有root权限,并且不需要密码的帐号。不想开通的话直接root上
  5. 所有电脑开通ssh服务,并且root可以免密码登陆

所有电脑上配置ceph的源,并安装ceph-deploy

wget -q -O- 'https://download.ceph.com/keys/release.asc' | sudo apt-key add -
echo deb https://download.ceph.com/debian-jewel/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list
apt update
apt install ceph-deploy

可能仅再master上安装即可,但为了使用正确的版本,还是安装下比较好

安装ceph

清除老旧的安装(如果有的话)

ceph-deploy purgedata node1 node2
ceph-deploy forgetkeys
ceph-deploy purge node1 node2

PS: 如果节点的用户名不一致的话,使用user@node的形式

安装

大部分的操作都在mon的主机上运行即可

环境准备

  • 存放配置

    新建一个目录,存放安装的相关配置模板

    mkdir -p cephinstall
    cd cephinstall
    
    ceph-deploy new node1#... (monitor节点)
    
  • 配置ceph模板(ceph.conf文件)

    ext4 文件名过长的bug, 添加下面的配置

    osd_max_object_name_len = 256
    osd_max_object_namespace_len = 64
    osd_check_max_object_name_len_on_startup = false
    

    和kernel相关的支持,防止rbd info出错,其实是部分特性不支持,下面的这个是最基本的,添加后后续所有的部署都自动使用

    rbd_default_features=1
    

    完整的配置:

    [global]
    fsid = 6ee65fe7-760d-4dbb-a401-4babb19d940d
    mon_initial_members = node1
    mon_host = 192.168.228.129
    auth_cluster_required = cephx
    auth_service_required = cephx
    auth_client_required = cephx
    public_network = 192.168.228.0/24
    cluster_network = 192.168.228.0/24
    rbd_default_features=1
    osd_max_object_name_len = 256
    osd_max_object_namespace_len = 64
    osd_check_max_object_name_len_on_startup = false
    

    一般public_network等网络会自动识别的,默认是小局域网(255台最多,可以修改成需要的)

部署软件

ceph-deploy install node1 node2 #....

在各个节点中创建ceph存放文件的目录,并且修改为ceph:ceph拥有

  • 初始化monitor节点(仅在monitor节点运行)并运行
    ceph-deploy mon create-initial
    
  • 初始化osd节点(在monitor节点使用ceph-deploy,可以直接部署所有的节点)
    ceph-deploy osd prepare node1:path node2:path #....
    

    上述命令,node1同时也被用作osd节点了,我只用了两台服务器,而osd节点要求至少需要两个节点才能工作,因此mon节点同时兼做osd节点了

  • 激活osd节点
    ceph-deploy osd activate node1:path node2:path #....
    

    如果以上工作正常,已经部署完毕了

检查

ceph-deploy admin node1 node1 node2
ceph osd tree
ceph -s

其他

某个osd节点挂了,要移除

ceph osd out osd.1
ceph osd down osd.1
ceph osd rm osd.1
ceph osd crush rm osd.1

rbd ls 等一直卡住

使用ceph osd tree检查下,是否只剩下一个osd节点了,只有一个osd节点rbd是无法工作的,类似raid1的机制

获取client.admin的keyring值

kubernetes中会用到,kubernetes需要base64编码

ceph auth get-key client.admin | base64

关于docker的一些tips

关于docker启动参数中–dns的配置

建议使用默认不配置的。使用kubernetes的时候,这个参数将会影响容器中的相关解析, 也会影响关于kubernetes的部署,容器中网络无法解析,ping不通等。举个例子:

  1. 配置为–dns 127.0.0.1, 本意是为了使用本地的dns缓存,但容器中可能也使用这个来解析,而kubernetes中容器自身无法提供这一解析
  2. 配置为–dns 8.8.8.8,可能通过hostname无法解析本地局域网中的服务器
  3. 配置为–dns 局域网网关, 这个可能是默认的方式了,但我刚开始部署的时候是在虚拟机中的,无法解析虚拟机网络中的其他服务器了。

自建仓库关于https:// /_ping 之类错误

  1. 如果服务器无法提供https的话,启动参数添加如:
--insecure-registry hub.4096.info:5000
  1. 如果确实只提供https的话,复制crt和privatekey文件到/etc/docker/certs.d/domain/目录下,对于letsencrypt生成的为fullchain.pem和privkey.pem。比如我自己的,复制到/etc/docker/certs.d/hub.4096.info

查看完整的启动命令

docker inspect  -f "{{.Name}} {{.Config.Cmd}}" $(docker ps -a -q)

清理log

需要root权限

echo "" > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)

ubuntu 16.04 (systemd控制)

启动参数配置在/lib/systemd/system/docker.service中配置