基于 ubuntu 14.04 的 kubernetes (k8s) 的安装、应用实践
该项目提供了一种快速上手k8s的安装、应用实践教程
- 文档类
- 安装方法类
- Vernlium-k8s安装步骤
- Vernlium-flannel安装步骤
- 国内网络环境获取gcr.io/google-containers镜像的方法
- linux-upstart
- etcd集群部署的坑
- etcd集群安装配置
- 使用kube-proxy让外部网络访问K8S service的ClusterIP
- k8s 安装 heketi服务动态使用GlusterFS
- glusterfs + heketi实现kubernetes的共享存储
- 在kubernetes集群中部署mysql主从
- kubernetes中文社区
- 其他文档
- Linux shell字符串截取与拼接
- linux shell 数组建立及使用技巧
- Kubernetes vs Docker Swarm
- 巅峰对决之Swarm、Kubernetes、Mesos
- Docker Swarm和Kubernetes在大规模集群中的性能比较
- Docker Swarm vs Kubernetes
- Kubernetes为什么很重要?
- 持久卷PV和PVC的使用
- CentOS 7 安装 GlusterFS
- pv 和 pvc的绑定
以下操作需要在所有节点执行
- 设置/etc/hosts 解析
- 集群节点ssh免密码连接
- 集群时间同步
- 关闭、禁用所有节点的防火墙
- 安装docker-ce
- 禁用交换内存(k8s version 1.8+ )
- 设置允许路由转发,不对bridge的数据进行处理
- 设置/etc/hosts解析
下文均按此示例操作:
ip地址 | 主机名 | 备注 |
---|---|---|
192.168.1.3 | cloud03 | workerNode |
192.168.1.5 | cloud05 | masterNode workerNode |
192.168.1.6 | cloud06 | workerNode |
ssh [email protected]
cat >> /etc/hosts << EOF
192.168.1.3 cloud03
192.168.1.5 cloud05
192.168.1.6 cloud06
EOF
for ip in 3 6;do scp /etc/hosts [email protected].$ip:/etc/;done
- ssh 免密码链接
ssh [email protected]
ssh-keygen -t rsa
# 一路回车
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
# 在其他节点重复以上操作
# 复制集群其他节点的id_rsa.pub文件到~/.ssh/authorized_keys
for ip in 3 6;do scp [email protected].$ip:/root/.ssh/id_rsa.pub ./$ip.pub;done
for ip in 3 6;do cat ./$ip.pub >> ~/.ssh/authorized_keys;done
# 分发公钥
for ip in 3 6;do scp ~/.ssh/authorized_keys [email protected].$ip:/root/.ssh/;done
-
关闭、禁用所有节点的防火墙
ssh [email protected]
service ufw stop
#检查一下
service ufw status
# 确认是否是inactive
# 去其他节点重复操作
- 安装docker-ce
官方ubuntu docker安装文档 清华镜像安装(推荐)
# 安装依赖
sudo apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common
# 添加GPG公钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# ubuntu amd64
sudo add-apt-repository \
"deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) \
stable"
sudo apt-get update
# 不能安装太高的,否则可能导致kubelet无法启动
sudo apt-get install docker-ce=17.03.0~ce-0~ubuntu-trusty
- 禁用交换内存(k8s version 1.8+ )
swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab
- 设置允许路由转发,不对bridge的数据进行处理
cat <<EOF > /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl -p /etc/sysctl.d/k8s.conf
以下步骤在所有节点上执行
wget -c https://github.com/coreos/etcd/releases/download/v3.2.20/etcd-v3.2.20-linux-amd64.tar.gz
tar -xvzf etcd-v3.2.20-linux-amd64.tar.gz
mv etcd-v3.2.20-linux-amd64/etcd* /usr/local/bin
# check
which etcd
/usr/local/bin/etcd
wget -c https://github.com/coreos/flannel/releases/download/v0.10.0/flannel-v0.10.0-linux-amd64.tar.gz
tar -xvzf flannel-v0.10.0-linux-amd64.tar.gz
mv flanneld /usr/local/bin/
mv mk-docker-opts.sh /usr/local/bin/
# check
which flanneld
/usr/local/bin/flanneld
apt-get install -y keepalived haproxy ipvsadm
ansible是一个自动化管理工具,可以一键在多机器上面执行命令,适合集群管理。安装ansible之前需要保证集群的SSH免密码链接
sudo apt-get install software-properties-common
sudo apt-add-repository ppa:ansible/ansible
sudo apt-get update
sudo apt-get install ansible
# 下面all组的该为真实的集群主机名
cat > /etc/ansible/hosts << EOF
[all]
cloud03
cloud05
cloud06
EOF
# test,显示success说明已经ansible配置成功
ansible all -m ping
cloud05 | SUCCESS => {
"changed": false,
"ping": "pong"
}
cloud03 | SUCCESS => {
"changed": false,
"ping": "pong"
}
cloud06 | SUCCESS => {
"changed": false,
"ping": "pong"
}
以下步骤均在master节点执行
创建/etc/kubernetest/ssl目录,命令如下
ansible all -m shell -a "mkdir -p /etc/kubernetes/ssl"
# 可根据需要自行选择安装k8s的版本,注意k8s 1.8版本及以上的需要安装
wget -c https://dl.k8s.io/v1.8.12/kubernetes-server-linux-amd64.tar.gz
# sha256hash: c2afbabf2e172ce7cd6a58b314d2e82e0cd6d42955a3a807567c785bbab9fea6
# 验证hash
sha256sum kubernetes-server-linux-amd64.tar.gz
c2afbabf2e172ce7cd6a58b314d2e82e0cd6d42955a3a807567c785bbab9fea6 kubernetes-server-linux-amd64.tar.gz
tar -xvzf kubernetes-server-linux-amd64.tar.gz
cd kubernetes
cp -r server/bin/{kube-apiserver,kube-controller-manager,kube-scheduler,kubectl,kube-proxy,kubelet} /usr/local/bin/
# 分发到其他workder node上去
for ip in 3 6;do scp -r server/bin/{kube-proxy,kubelet} [email protected].$ip:/usr/local/bin/;done
需要生成的CA证书和秘钥文件如下:
- ca-key.pem
- ca.pem
- kubernetes-key.pem
- kubernetes.pem
- kube-proxy.pem
- kube-proxy-key.pem
- admin.pem
- admin-key.pem
使用的证书文件如下:
- etcd:使用 ca.pem、kubernetes-key.pem、kubernetes.pem;
- kube-apiserver:使用 ca.pem、kubernetes-key.pem、kubernetes.pem;
- kubelet:使用 ca.pem;
- kube-proxy:使用 ca.pem、kube-proxy-key.pem、kube-proxy.pem;
- kubectl:使用 ca.pem、admin-key.pem、admin.pem;
- kube-controller-manager:使用 ca-key.pem、ca.pem
详细步骤: 创建TLS证书和秘钥
一键生成CA文件:
# 安装CFSSL
./get_cfssl.sh
# 生成CA证书和秘钥文件
./generate_ssl.sh 192.168.1.3 192.168.1.5 192.168.1.6
- 生成upstart脚本和相应配置文件
su root
git clone https://github.com/xiongraorao/Athena.git
cd Athena
./configure 192.168.1.5 192.168.1.3 192.168.1.5 192.168.1.6
- 生成SSL证书文件
需要生成的CA证书和秘钥文件如下:
- ca-key.pem
- ca.pem
- kubernetes-key.pem
- kubernetes.pem
- kube-proxy.pem
- kube-proxy-key.pem
- admin.pem
- admin-key.pem
使用的证书文件如下:
- etcd:使用 ca.pem、kubernetes-key.pem、kubernetes.pem;
- kube-apiserver:使用 ca.pem、kubernetes-key.pem、kubernetes.pem;
- kubelet:使用 ca.pem;
- kube-proxy:使用 ca.pem、kube-proxy-key.pem、kube-proxy.pem;
- kubectl:使用 ca.pem、admin-key.pem、admin.pem;
- kube-controller-manager:使用 ca-key.pem、ca.pem
详细步骤: 创建TLS证书和秘钥
一键生成CA文件:
# 安装CFSSL
./get_cfssl.sh
# 生成CA证书和秘钥文件
./generate_ssl.sh 192.168.1.3 192.168.1.5 192.168.1.6
- 启动k8s
# 每个节点执行
start etcd
# 生成kubeconfig文件
./kubeconfig.sh 192.168.1.5 192.168.1.3 192.168.1.5 192.168.1.6
# 配置flanneld, 后面接的参数可以是etcd 任一节点的IP
ansible all -m shell -a "./flanneld_config.sh 192.168.1.5"
# 检查各个节点的docker daemon 是否完全重启成功
# 检查docker0 和 flannl.1 的地址是否在同一个网段
ifconfig docker0
ifconfig flannel.1
# 主节点配置kubernetes cluster的各种参数
./kubeconfig.sh
# 主节点查看kubelet请求
kubectl get csr
# csr-xxx
# 主节点同意kublet 请求
kubectl certificate approve csr-xxx
注意:如果master 无法发现kubelet 的注册请求,请查看相应节点的kubelet 服务的运行状态
# 1. 查看kubelet节点运行状态
status kubelet
# 2. 如果显示stop/waiting
start kubelet
tailf /var/log/upstart/kubelet.log
# 3. 检查node节点状态
kubectl get nodes
# 4. 如果节点状态是NotReady
kubectl describe nodes
# 5. 检查docker daemon 服务
cat /etc/default/docker # 查看DOCKER_OPTS变量是否配置正确,参考flanneld配置部分
service docker restart
docker info
docker ps
- 关闭k8s
# 每个节点执行
stop etcd
dashboard v1.6.0 dashboard v1.7.1安装步骤
traefik高可用的配置:
apt-get install keepalived ipvsadm
vim /etc/keepalived/keepalived.conf
# 配置virtual_server 和real_server, 保证virtual_server 是局域网中一个可用的ip
for ip in seq 3 5 6; do scp conf/keepalived-master.conf [email protected].$ip:/etc/keepalived/; done
注意,如果node的80端口被占用的话,会导致启动traefik失败
此处有个坑,要求每个node必须安装好socat和nsenter github issue 解决如下:
# 1. install socat
sudo apt-get update && sudo apt-get install socat
# 2. install nsenter
cd /tmp;
curl https://www.kernel.org/pub/linux/utils/util-linux/v2.25/util-linux-2.25.tar.gz | tar -zxf-; cd util-linux-2.25;
sudo apt-get install autopoint autoconf libtool automake
./configure --without-python --disable-all-programs --enable-nsenter --without-ncurses
make nsenter
cp nsenter /usr/local/bin
cd yaml/nginx/
kubectl create -f .
cd yaml/mysql/
./gluster_mysql.sh
kubectl create -f .
默认三个节点,如果需要增加节点,需要手动修改gluster_zk.sh文件, 增加volumes,也需要手动增加pv和pvc
cd yaml/zookeeper/
./gluster_zk.sh
kubectl create -f .
默认三个节点,如果需要增加节点,需要手动修改gluster_kafka.sh文件, 增加volumes,也需要手动增加pv和pvc
cd yaml/kafka/
./gluster_kafka.sh
kubectl create -f .
默认三个节点,如果需要增加节点,需要手动修改gluster_seaweedfs.sh文件, 增加volumes,也需要手动增加pv和pvc
cd yaml/seaweedfs/
./gluster_seaweedfs.sh
kubectl create -f .
k8s1.5之后的版本支持动态分配PV和PVC,使用storage class对象来完成动态PV和PVC的分配,对于有状态的应用是十分友好的,便于扩展。参考链接:glusterfs 作为provisioner 部署zookeeper