前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >旧代码拾遗:如何在 Python 代码中修改 DNS 解析

旧代码拾遗:如何在 Python 代码中修改 DNS 解析

作者头像
布鲁斯鱼
发布2022-11-02 14:13:35
1.9K0
发布2022-11-02 14:13:35
举报
文章被收录于专栏:布鲁斯鱼的妙想天开

Why

我们访问 K8S 的 ApiServer 服务,由于为了保证安全性,证书中签发的域名仅包括 kubernetes 和初始的有限 IP 列表,当 ApiServer 服务的 Master 节点需要被替换时,就无法使用新的节点 IP 访问了。解决的方案就是将 kubernetes 域名和新的 IP 临时绑定,骗过证书校验。

How?

废话不多说,直接看代码

代码语言:javascript
复制
# -*- coding: utf-8 -*-
import contextlib
import importlib
import threading
from typing import Callable, Dict, Optional

from urllib3.util import connection


class CustomLocalDnsResolver(threading.local):
    """支持线程级自定义 Dns 记录
    """

    def __init__(self, dns_map: Optional[dict]=None):
        # 线程保存各自 dns_map,但是访问入口均为 dns_map
        self.dns_map = dns_map or {}


def get_patch_create_connection_with_dns(dns_resolver) -> Callable:
    """simply get patched create_connection"""

    # 保留原方法
    _orig_create_connection = getattr(importlib.import_module('urllib3.util.connection'), 'create_connection')

    def patched_create_connection(address, *args, **kwargs):
        """在 urllib3's create_connection 流程前解析 address"""
        domain, port = address
        # 当 _local_dns.dns_map 为空,对正常流程无影响
        host = dns_resolver.dns_map.get(domain, domain)
        return _orig_create_connection((host, port), *args, **kwargs)

    return patched_create_connection


_local_dns = CustomLocalDnsResolver()
# patch 全局 create_connection
connection.create_connection = get_patch_create_connection_with_dns(_local_dns)


@contextlib.contextmanager
def update_local_dns_once(dns_map: Dict):
    """一次性修改线程 dns 解析"""
    _local_dns.dns_map = dns_map
    yield
    _local_dns.dns_map = {}


# 具体的使用场景
with update_local_dns_once({"kubernetes": "192.168.1.1"}):
    # 可以在该 context 中请求外部系统
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022 年 2 月 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Why
  • How?
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档